ASP.NET MVC 模型绑定 - 第 2 部分






4.55/5 (9投票s)
本文为读者提供了关于 ASP.NET MVC 模型绑定如何工作的详细理解。
引言
本文是文章 ASP.NET MVC 模型绑定 - 第 1 部分 的延续。如果您尚未阅读该链接,建议您浏览该链接。由于我的健康状况,我无法立即继续撰写本文。
本文涵盖了模型绑定的其余部分、集合绑定、对象集合绑定以及使用值提供程序。
Using the Code
本文提供的示例是使用 VS2008 SP1 开发的。建议使用相同版本的 Visual Studio。为简单起见,上述链接(前一个链接)中的源代码已更新,以包含更多视图。添加了额外的视图来解释不同类型的模型绑定。 此处是下载完整代码。
代码包含 EmployeeView1
到 5 个文件。EmployeeView1
, EmployeeView2
在前一篇文章中已解释。本文重点介绍 EmployeeView3
, EmployeeView4
, EmployeeView5
视图。
集合绑定
将 HTML 输入绑定到集合是集合绑定。当我们运行示例时,每个页面都包含指向下一页和上一页的链接,转到 Model3
员工视图页面。以下是员工模型绑定 3 的屏幕截图。

此页面旨在输入员工技能,员工可以拥有多种技能,如 Java、.NET 等。为简单起见,我们在此处获取两个技能输入
此页面的关联模型是:
public class EmployeeSkills
{
[DisplayName("Employee ID")]
[Required(ErrorMessage = "ID Required")]
public int EmpId { get; set; }
[DisplayName("Employee Skills")]
public string[] Skills { get; set; }
}
EmployeeSkills
模型保存每个员工的技能,这是一个集合,EmpId
是员工 ID。
视图页面包含以下代码
<%= Html.TextBox("Skills[0]")%>
<%= Html.ValidationMessageFor(model => model.Skills)%>
<%= Html.TextBox("Skills[1]")%>
<%= Html.ValidationMessageFor(model => model.Skills)%>
来自第一个文本框的输入将绑定到 Skills[0]
,来自第二个文本框的输入将绑定到 eSkills
对象的 Skills[1]
。以下是与上述绑定关联的操作方法。
public ActionResult SkillsUpdate(EmployeeSkills eSkills)
{
return View("EmployeeView3");
}
对象集合绑定
将 HTML 输入绑定到对象集合是对象集合绑定。为了解释对象集合绑定,请访问示例中提供的页面 Employee
视图 4,以下是该页面的屏幕截图

EmployeeView4
视图页面包含以下代码
<table border="1"><tbody><tr><td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpId) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[0].EmpId") %>
<%= Html.ValidationMessageFor(model => model.EmpId) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpName) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[0].EmpName") %>
<%= Html.ValidationMessageFor(model => model.EmpName) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpDesignation) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[0].EmpDesignation") %>
<%= Html.ValidationMessageFor(model => model.EmpDesignation) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpDepartment) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[0].EmpDepartment") %>
<%= Html.ValidationMessageFor(model => model.EmpDepartment) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpSalary) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[0].EmpSalary") %>
<%= Html.ValidationMessageFor(model => model.EmpSalary) %>
</div>
</td>
</tr>
<tr><td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpId) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[1].EmpId") %>
<%= Html.ValidationMessageFor(model => model.EmpId) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpName) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[1].EmpName") %>
<%= Html.ValidationMessageFor(model => model.EmpName) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpDesignation) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[1].EmpDesignation") %>
<%= Html.ValidationMessageFor(model => model.EmpDesignation) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpDepartment) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[1].EmpDepartment") %>
<%= Html.ValidationMessageFor(model => model.EmpDepartment) %>
</div>
</td>
<td>
<div class="editor-label">
<%= Html.LabelFor(model => model.EmpSalary) %>
</div>
<div class="editor-field">
<%= Html.TextBox("employee[1].EmpSalary") %>
<%= Html.ValidationMessageFor(model => model.EmpSalary) %>
</div>
</td>
</tr>
</tbody>
</table>
在上述视图页面中,注意 employee[index].PropertyName
。此表示法将 employee[0]
对象绑定到员工对象集合中的第一个对象,将 employee[1]
绑定到 employee
对象集合中的第二个对象。
在第一个文本框中输入的值将绑定到第一个员工对象 EmpId
,因为它在视图页面中与 employee[0].EmpId
相关联。以下是对象集合绑定的操作方法,employee
是一个 Employee
数组。
[HttpPost]
public ActionResult MultipleObjectCollection(Employee[] employee)
{
return View("EmployeeView4");
}
使用值提供程序
如果默认模型绑定器对于模型绑定不够好,并且当我们需要更多地控制模型绑定时,我们可以采用值提供程序的方法,FormCollection
是传递给操作方法的表单值的键值对,并且使用控制器 UpdateModel(....)
方法,并且使用值提供程序我们可以更新模型。ASP.NET MVC 提供了方法 UpdateModel(...)
,它使用值提供程序提供的值更新模型。以下是使用值提供程序手动更新模型的代码。
public ActionResult ValueProvider(FormCollection fc)
{
Employee employee = new Employee();
if(TryUpdateModel(employee,fc.ToValueProvider()))
UpdateModel(employee, fc.ToValueProvider());
return View("EmployeeView5");
}
这使用 EmployeeView5
视图页面进行了解释。当用户提交页面时,FormCollection
获取提交表单的所有值。
免责声明
本文使用了一个示例,该示例不用于直接生产部署。这是为了让读者了解模型绑定如何工作。读者有责任在实现模型绑定时遵循必要的最佳实践。