asp.net mvc模型绑定允许您将http请求数据与模型进行映射。 这是使用http请求中的浏览器发送的数据创建.net对象的过程。对于asp.net mvc而言,asp.net web forms开发人员大多都感到困惑,因为视图的值在到达控制类的动作方法时会如何转换为model类,这个转换由模型绑定器完成。
模型绑定是http请求和 c# 操作方法之间的良好设计桥梁。 它使开发人员可以方便地使用表单(视图)上的数据,因为post和get会自动传输到指定的数据模型中。 asp.net mvc使用默认的绑定器来完成这个场景。
我们来看一个简单的例子,在上一章的项目中添加一个“创建视图”,我们将看到如何从视图中获取这些值传到employeecontroller动作方法。
以下是post的创建动作方法。
// post: employee/create
[httppost]
public actionresult create(formcollection collection){
try{
// todo: add insert logic here
return redirecttoaction("index");
}catch{
return view();
}
}
右键单击create动作方法,然后选择添加视图…, 它将显示添加视图对话框。
如在上面的屏幕截图中看到的那样,默认的动作名字已经在输入框中了。现在从“模板”下拉列表中选择“create”,从“模型”下拉列表中选择“employee”。参考下图 -

创建的create.cshtml 视图中看到默认代码如下 -
@model mvcsimpleapp.models.employee
@{
layout = null;
}
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>create</title>
</head>
<body>
@using (html.beginform())
{
@html.antiforgerytoken()
<div class="form-horizontal">
<h4>employee</h4>
<hr />
@html.validationsummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@html.labelfor(model => model.name, htmlattributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@html.editorfor(model => model.name, new { htmlattributes = new { @class = "form-control" } })
@html.validationmessagefor(model => model.name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@html.labelfor(model => model.joiningdate, htmlattributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@html.editorfor(model => model.joiningdate, new { htmlattributes = new { @class = "form-control" } })
@html.validationmessagefor(model => model.joiningdate, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@html.labelfor(model => model.age, htmlattributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@html.editorfor(model => model.age, new { htmlattributes = new { @class = "form-control" } })
@html.validationmessagefor(model => model.age, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@html.actionlink("back to list", "index")
</div>
</body>
</html>
当用户在创建视图上输入值时,它在formcollection和request.form中都可用。可以使用这些值中的任何一个来填充视图中的员工信息。
使用下面的代码来(formcollection)创建员工信息。参考以下代码 -
// post: employee/create
[httppost]
public actionresult create(formcollection collection){
try {
employee emp = new employee();
emp.name = collection["name"];
datetime jdate;
datetime.tryparse(collection["dob"], out jdate);
emp.joiningdate = jdate;
string age = collection["age"];
emp.age = int32.parse(age);
emplist.add(emp);
return redirecttoaction("index");
}catch {
return view();
}
}
运行这个应用程序并请问这个url:http:// localhost:63004 / employee /。将收到以下输出结果 -

点击页面顶部的“create new”链接,它将转到下面的视图。如下所示 -

输入想要添加的其他员工的数据。如下所示 -

点击创建按钮,会看到新员工被添加到列表中。如下图所示 -

在上面的示例中,从html视图中获取所有发布的值,然后将这些值映射到employee属性并逐一分配它们。
在这种情况下,我们也将在发布的值与model属性的格式不相同的情况下进行类型转换。
这也被称为手动绑定,这种类型的实现对于简单和小数据模型可能不是那么糟糕。 但是,如果对于具有大量的数据类型的模型,则需要大量的类型转换,那么可以利用asp.net mvc model绑定的强大功能和易用性。
下面来看看为模型绑定所做的另一个例子。
我们需要改变create方法的参数来接受employee模型对象而不是formcollection对象,如下面的代码所示。
// post: employee/create
[httppost]
public actionresult create(employee emp){
try{
emplist.add(emp);
return redirecttoaction("index");
}catch{
return view();
}
}
现在,模型绑定的魔力取决于提供值的html变量的id。
对于employee模型,html输入字段的id应该与employee模型的属性名称相同,可以看到visual studio在创建视图时使用了相同的模型属性名称。如下代码 -
@html.editorfor(model => model.name, new { htmlattributes = new { @class = "form-control" } })
映射将基于默认的属性名称。在这里,您会发现html助手方法非常有用,因为这些助手方法将生成html,它将具有适当的名称以使模型绑定起作用。
运行修改代码的应用程序,与上面的运行结果一样。