65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (9投票s)

2011年3月27日

CPOL

3分钟阅读

viewsIcon

61290

downloadIcon

1039

本文为读者提供了关于 ASP.NET MVC 模型绑定如何工作的详细理解。

引言

本文是文章 ASP.NET MVC 模型绑定 - 第 1 部分 的延续。如果您尚未阅读该链接,建议您浏览该链接。由于我的健康状况,我无法立即继续撰写本文。 

本文涵盖了模型绑定的其余部分、集合绑定、对象集合绑定以及使用值提供程序。 

Using the Code

本文提供的示例是使用 VS2008 SP1 开发的。建议使用相同版本的 Visual Studio。为简单起见,上述链接(前一个链接)中的源代码已更新,以包含更多视图。添加了额外的视图来解释不同类型的模型绑定。 此处是下载完整代码。 

代码包含 EmployeeView1 到 5 个文件。EmployeeView1, EmployeeView2 在前一篇文章中已解释。本文重点介绍 EmployeeView3, EmployeeView4, EmployeeView5 视图。

集合绑定

将 HTML 输入绑定到集合是集合绑定。当我们运行示例时,每个页面都包含指向下一页和上一页的链接,转到 Model3 员工视图页面。以下是员工模型绑定 3 的屏幕截图。

CollectionBinding.JPG

此页面旨在输入员工技能,员工可以拥有多种技能,如 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,以下是该页面的屏幕截图

ObjectCollectionBinding.JPG

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 获取提交表单的所有值。

免责声明

本文使用了一个示例,该示例不用于直接生产部署。这是为了让读者了解模型绑定如何工作。读者有责任在实现模型绑定时遵循必要的最佳实践。

© . All rights reserved.