检查IsPostBack属性,可以确定响应的请求是否为发回到服务器的窗体。如果是,则创建GuestResponse数据模型对象的一个新实例,并将此实例传递给TryUpdateModel方法(该方法继承自基本的Page类,也就TryUpdateModel是Default类的父类Page类里的一个成员方法。)
TryUpdateModel方法将执行一个称为模型绑定(model binding)的过程,在此过程中,将使用来自浏览器请求的数据值填充数据模型对象的属性。TryUpdateModel方法的另一个参数是ASP.NET用于获取所需值的对象——System.Web.ModelBinding.FormValueProvider类,它提供来自窗体数据的值。第三部分将详细介绍模型绑定,调用TryUpdateModel方法的结果是:更新GuestResponse对象的属性,以反映用户在窗体中提交的数据值,然后将GuestResponse对象存储在存储库中。
我们希望在用户提交窗体时向用户提供某种反馈,Response.Redirect方法可以实现这一目的,该方法会重定向用户的浏览器。如果WillAttend属性为true,说明用户将参加晚会,则将该用户重定向到seeyouthere.html文件;否则会将该用户重定向到sorryyoucantcome.html文件。
1. 创建HTML响应文件
并不是ASP.NET应用程序中的所有页面都必须从Web窗体文件生成,还可以包括常规的静态HTML文件。要创建响应文件,在Solution Explorer中右键单击PartyInvites项,然后从弹出式菜单中选择Add→New Item。从Add New Item(添加新项)对话框中选择HTML Page(HTML页)模板,并将名称设置为seeyouthere.html。最后,单击Add按钮创建HTML文件。该文件的内容如代码清单1-11所示。
代码清单1-11 seeyouthere.html文件的内容
重复上述过程,创建sorryyoucantcome.html文件,它的内容如代码清单1-12所示。
代码清单1-12 sorryyoucantcome.html文件的内容
2. 将HTML元素纳入作用域
我们已建立了应用程序的基本结构,但似乎还差点什么。我们需要告诉Visual Studio,当应用程序启动时,应加载哪个文件。在此之前,这并不是问题,因为只有Default.aspx这一个文件,Visual Studio足够智能,知道这是所需要的文件。但现在还有其他几个HTML文件,因此需要向Visual Studio发出指示。在Solution Explorer中右键单击Default.aspx项,然后从弹出菜单中选择Set as Start Page(设为起始页)。
现在,你可以从Debug菜单中选择Start Debugging(启动调试),或单击Internet Explorer工具栏按钮来启动应用程序。填写窗体,确保选择了select元素中的Yes选项。提交时,你却看到只有在选择No选项时才会看到的响应,如图1-10所示。很明显,什么地方出错了。
之所以会出现这个问题,是因为在处理Web窗体文件时,ASP.NET仅查找runat特性值为server的元素。所有其他元素均被忽略,由于Default.aspx文件中的input元素和select元素没有这个特性/值组合,模型绑定过程找不到在HTML窗体中提交的值。在代码清单1-13中,我们更正了这个问题。
代码清单1-13 向input元素和select元素添加runat特性
提示 除server以外,runat特性并没有其他值。如果忽略runat特性,或使用除server以外的其他值,ASP.NET将找不到HTML元素。如果Web窗体未表现出预期行为,首先你应检查是否缺少了runat特性。
启动应用程序并重新填写窗体。提交窗体后,你将会看到正确的响应,如图1-11所示。