猿教程 Logo

绑定Model

在本节中,您将了解在MVC框架中的模型绑定。

要理解MVC中的模型绑定,首先让我们看看如何使用传统的ASP.NET风格获取action方法中的http请求值。 下图显示了如何通过在action方法中直接使用Request对象从HttpGET和HttpPOST请求获取值。


如上图所示,我们使用Request.QueryString和Request(Request.Form)对象从HttpGet和HttpPOST请求获取值。 使用Request对象访问请求值是一个繁琐和浪费时间的活动。

使用模型绑定,MVC框架将http请求值(从查询字符串或表单集合)转换为操作方法参数。 这些参数可以是原始类型或复杂类型。


绑定到基本类型:

HttpGET请求将数据嵌入到查询字符串中。 MVC框架自动将查询字符串转换为action方法参数。 例如,以下GET请求中的查询字符串“id”将自动映射到Edit()操作方法的id参数。


您也可以在具有不同数据类型的操作方法中具有多个参数。 查询字符串值将根据匹配名称转换为参数。

例如,http:// localhost / Student / Edit?id = 1&name = John将映射到以下Edit操作方法的id和name参数。

相关实例:

public ActionResult Edit(int id, string name)
{            
    // do something here
            
    return View();
}

绑定到复杂类型:

模型绑定也适用于复杂类型。 MVC框架中的模型绑定自动将HttpPOST请求的表单字段数据转换为操作方法的复杂类型参数的属性。

参考以下模型类。

相关实例:

public class Student
{
    public int StudentId { get; set; }
    [Display(Name="Name")]
    public string StudentName { get; set; }
    public int Age { get; set; }
    public Standard standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
}

现在,您可以创建一个包含Student类型参数的操作方法。 在以下示例中,编辑操作方法(HttpPost)包括学生类型参数。

相关实例:

[HttpPost]
public ActionResult Edit(Student std)
{
    var id = std.StudentId;
    var name = std.StudentName;
    var age = std.Age;
    var standardName = std.standard.StandardName;

    //update database here..

    return RedirectToAction("Index");
}

所以现在,当表单将http POST请求提交到Edit操作方法时,MVC框架会自动将Form集合值映射到Student类型参数,如下所示。


因此,它自动将表单字段绑定到action方法的复杂类型参数。

FormCollection:

您还可以在操作方法中包括FormCollection类型参数,而不是复杂类型,以从视图表单字段检索所有值,如下所示。



绑定属性:

ASP.NET MVC框架还允许您指定要绑定的模型类的哪些属性。 [Bind]属性将允许您指定模型绑定器在绑定中应包括或排除的确切属性。

在以下示例中,“Edit”方法将仅绑定学生模型的StudentId和StudentName属性。

相关实例:

[HttpPost]
public ActionResult Edit([Bind(Include = "StudentId, StudentName")] Student std)
{
    var name = std.StudentName;
           
    //write code to update student 
            
    return RedirectToAction("Index");
}

您也可以使用排除属性,如下所示。

相关实例:

[HttpPost]
public ActionResult Edit([Bind(Exclude = "Age")] Student std)
{
    var name = std.StudentName;
           
    //write code to update student 
            
    return RedirectToAction("Index");
}

Bind属性将仅通过绑定所需的属性来提高性能。


内部模型绑定:

如您所见,模型绑定会自动将请求值转换为原始或复杂类型对象。 模型绑定是一个两步过程。 首先,它从传入的http请求收集值,然后,使用这些值填充原始类型或复杂类型。

Value提供者负责从请求中收集值,而模型绑定者负责填充值。


默认值提供程序集合评估来自以下来源的值:

  1. 当操作是子操作时,先前绑定的操作参数

  2. 表单字段(Request.Form)

  3. JSON请求正文(Request.InputStream)中的属性值,但仅当请求是AJAX请求时

  4. 路由数据(RouteData.Values)

  5. 查询字符串参数(Request.QueryString)

  6. 发布文件(Request.Files)

MVC包括有效绑定大多数模型类型的DefaultModelBinder类。

有关模型绑定的详细信息,请访问MSDN


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/mvc/mvc-binding-model.html