18.4 表单数据绑定
在ASP.NET MVC的框架中,将视图中的数据传递到控制器中,主要通过发送表单的方式来实现,通常使用Request.Form、FormCollection读取表单数据或者直接读取表单数据对象。
18.4.1 Request.Form读取表单数据
Request.Form用于获取ASP.NET中窗体变量集合。它的基本语法:
代码中参数element指定集合要检索的表格元素的名称。Form集合按请求正文中参数的名称来索引。Request.Form(element)的值是请求正文中所有element值的数组。通过调用Request.Form(element).Count来确定参数中值的个数。如果参数未关联多个值,则计数为1。如果找不到参数,计数为0。
要引用有多个值的表格元素中的单个值,必须指定index值。index参数可以是从1到Request.Form(element).Count中的任意数字。如果引用多个表格参数中的一个,而未指定index值,返回的数据将是以逗号分隔的字符串。
在使用Request.Form参数时,Web服务器将分析HTTP请求正文并返回指定的数据。如果应用程序需要未分析的表格数据,可以通过调用不带参数的Request.Form访问该数据。
下面的代码示例如何使用Request.Form读取表单数据,先定义一个Employee员工类。
上面的代码中定义了Employee类的两个属性,分别是Name和Age,并设置了它们的自动实现属性。
然后在视图页面中设置表单,代码如下:
在上面的表单中处理表单数据的动作方法为控制器中的RequestForm方法,发送的表单数据是两个文本框Name和Age中的数据。
最后在控制器的RequestForm方法中实现获取表单中数据的代码如下:
上面的代码中第1行设置[AcceptVerbs(HttpVerbs.Post)]属性表示下面的方法只接受用户通过Post方法发送的表单数据。第4行和第5行通过Request.Form来分别读取两个文本框Name和Age中的数据,然后得到Employee类的实例化对象e。
18.4.2 FormCollection读取表单数据
FormCollection是用于获取Form表单中元素的集合。以上面创建的Employee类为例,以FormCollection获取表单数据在视图页面中的表单代码如下:
以上代码中处理表单数据动作方法为控制器中的FormCollection方法,发送的表单数据仍然是两个文本框Name和Age中的数据。代码中的粗体处显示与RequestForm表单的区别。
然后在控制器的FormCollection方法中实现获取表单中的数据代码如下:
上面的代码中第1行设置[AcceptVerbs(HttpVerbs.Post)]属性,表示下面的方法只接受用户通过Post方法发送的表单数据。第2行在FormCollection方法中传入了FormCollection方法类型的参数formCollection,该参数会自动绑定表单中所有的数据。第4行和第5行通过formCollection参数可以分别读取两个文本框Name和Age中的数据,然后就可以得到Employee类的实例化对象e。
在ASP.NET MVC项目中,通过FormCollection可以读取表单中指定的数据,借助控制器中的UpdateModel方法或TryUpdateModel方法,可以非常方便地对数据对象中相关属性的数据进行更新,比如下面的示例代码:
以上代码中第4行和第5行给e的两个属性赋值。第6行使用UpdateModel方法,第一个参数指定需要更新数据的对象为e,第二个参数指定需要被更新的对象中的属性名称,即只更新e对象中的Name属性,因此上面的代码的执行结果是,只读取表单发送过来的Name文本框中的数据。
18.4.3 直接读取表单数据对象
还是以上面创建的Employee对象为例,直接读取表单数据对象时在视图页面中的表单代码如下:
以上代码中处理表单数据动作方法为控制器中的Employee方法,发送的表单数据仍然是二个文本框Name和Age中的数据。代码中的粗体处显示与前二种读取方式的区别。
然后在控制器的Employee方法中实现读取表单中的数据代码如下:
在上面的代码中,Employee方法中传入了Employee类型的参数,其内部读取了二个文本框Name和Age中的数据,直接得到Employee类的实例化对象stu。
这里要注意的是直接读取表单对象时,发送表单的文本框名称必须与数据对象的熟悉名称相一致。