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,它将具有适当的名称以使模型绑定起作用。
运行修改代码的应用程序,与上面的运行结果一样。