在本文中,将探讨如何将jQuery与ASP.NET MVC模型绑定技术结合使用,以提高Web应用程序的开发效率和用户体验。模型绑定是ASP.NET MVC框架中的一个核心功能,它允许开发者将HTTP请求中的表单值和查询字符串参数自动转换为.NET对象。通过引入jQuery,可以进一步简化这一过程,并添加一些交互性强的UI元素,如日期选择器等。
模型绑定发生在MVC框架处理请求的过程中,位于路由和控制器创建之后。一旦控制器从工厂中创建出来,反射机制就会介入,将路由引擎接收到的请求(由客户端操作触发)与HTTP请求中的任何参数匹配起来。换句话说,表单值和查询字符串参数会自动转换为.NET对象,这是MVC框架的一个非常酷的功能。
为了简单说明模型绑定的工作原理,将设置一个快速演示。启动IDE并创建一个ASP.NET MVC 2 Web应用程序。删除Index文件(将稍后创建自己的Index)。以下是将遵循的步骤:
实际上不会在这里持久化任何东西,这只是演示。
导航到Models文件夹,右键点击添加——>类名为Person。按照以下方式完成类的定义:
public class Person
{
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}
需要在这里构建项目(SHIFT + CTRL + b),以便IDE能够在后续步骤中看到类。反射的类型感知要求类型存在于一个程序集中。
转到Controllers——>HomeController并删除ViewData赋值。将在这里创建一个新的Person并将其与视图一起返回。动作看起来非常简单:
public ActionResult Index()
{
return View(new Person());
}
右键点击方法中的任何地方,从上下文菜单中选择“添加视图…”。正在添加一个名为Index的视图,将其设置为强类型视图,并将视图内容设置为“创建”。这将允许代码生成器输出将要使用的表单的基本结构。
请注意,在这里,或者任何时候尝试添加视图时,如果项目模型没有通过构建项目来更新,类型不会出现在“视图数据类”下拉菜单中。如果是这种情况,可以取消,构建,然后重新打开对话框。
生成的页面是一个非常方便的起点。即使它没有为节省太多时间(毕竟所做的更改和删除),出于某种原因,它让感觉更好,因为计算机也做了一些工作。
让稍微清理一下。移除验证控件,删除包含“返回列表”链接的DIV,并更改H2为更有趣的内容。
因为不会将表单回发到Index动作方法,还需要更新using语句,以便为提交表单创建正确的调用:
Html.BeginForm("CreatePerson", "Home")
最后,让添加一些代码,对应的方法CreatePerson,以及在HomeController中的一个断点:
public ActionResult CreatePerson(Person person)
{
// 断点位置
return View();
}
上述代码实际上并没有做任何事情(也不会在断点之后去任何地方),但如果按照建议暂停并评估Person对象或分配给字符串的名称,将看到值被填充。
实际上有很多深入的解释,但这里是所做的以及MVC框架支持模型绑定的总结:
到目前为止,这只是MVC框架中简单模型绑定的演示。让让jQuery参与进来。
首先,通过将方法更改为仅接受POST并简单地将传递的Person对象返回到PartialView来开始。
[HttpPost]
public ActionResult CreatePerson(Person person)
{
return PartialView("PersonDetails", person);
}
这次将创建视图为部分视图,它将再次强类型为Person,但将视图内容设置为“详细信息”。
Visual Studio 2010中的MVC框架工具支持将为创建ASCX(服务器控件),显示所有字段。
删除生成的控件末尾的P标签,其中包含ActionLinks,只留下顶部的控件标签和FIELDSET控件。
接下来,进入Views——>Shared——>Site.Master并将jQuery添加到master页面的HEAD中。也将同时添加jQuery UI,以打开一些其他增强功能的大门。为了完全功能,项目中需要有CSS和images文件夹,以及在master页面的HEAD中链接的CSS。
在Index.aspx中,移除using语句,以便不再生成表单。如果使用Visual Studio 2010的可折叠区域,这很容易(可以折叠FIELDSET标签以查看整个using构造)。
在Index.aspx底部的提交按钮上添加一个ID,值为“create-person-button”。最后,在开始脚本之前,添加一个DIV来显示当人被“创建”时的部分视图。最后两个部分应该如下所示:
<div id="result"></div>
转到脚本
jQuery为提供了一种通过POST向服务器发送AJAX请求的简单方法。传递一个服务器期望的数据映射。结果可以传递给一个函数来评估结果。
有了这样的输入设置和占位符…呃…占位符,都已经准备好执行POST了。
将编写一个帮助函数来处理POST操作的结果,当然,还有一个jQuery的‘文档就绪’事件处理程序来设置日历并捕获提交按钮点击。
大部分代码应该很容易理解。一个有趣的部分是数据映射不需要用正确的大小写构造。也就是说,如果字段名是FirstName,可以在数据映射中使用FiRsTnAmE作为名称,这是可以的。
运行应用程序并享受!
jQuery UI日期选择器在行动:
表单提交后清除,显示POST的结果:
到目前为止,还没有设置任何验证,没有保存到任何数据库,如果服务器端出现错误,就完蛋了。
不幸的是,jQuery POST与未处理的异常在服务器上不兼容。$.post是$.ajax的子集的简写(带有一些预设),并且只为成功事件映射了一个处理程序(不是错误事件)。
要看到这一点,呃,在不活动状态中,将CreatePerson动作更改为以下内容:
public ActionResult CreatePerson(Person person)
{
return View("foo", person);
}