1. 使用Request.Form
MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交)。在表单提交之后,在Controller action中可以以Request.Form["key"] 的方式获取到值。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 <%Html.BeginForm("Index", "Home", FormMethod.Post); %>
2 <p>
3 编号:<%=Html.TextBox("Id", "", new { name="Id"})%>
4 </p>
5 <p>
6 姓名:<%=Html.TextBox("Name", "", new { name = "Name" })%>
7 </p>
8 <input type="submit" value="Submit" />
9 <%Html.EndForm(); %>
后台Action 的处理方式如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 public ActionResult Show()
2 {
3 Student stu=new Student();
4 if (!string.IsNullOrEmpty(Request.Form["Id"]))
5 {
6 stu.Id = Convert.ToInt32(Request.Form["Id"]);
7 }
8 stu.Name=Request.Form["Name"];
9 return View("Index");
10 }
当然上面是以Post方式提交数据,如果我们以Get方式提交,可以用QueryString 来获取数据。
Form["Key"] key 为表单元素的name属性值
2.使用FormCollection 方式获取数据
FormCollection 可以获取表单体积对象的集合
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 public ActionResult Show(FormCollection formCollection)
2 {
3 Student stu = new Student();
4 stu.Id = Convert.ToInt32(formCollection["Id"]);
5 stu.Name =formCollection["Name"];
6 return View("Index");
7 }
提交数据的时候,我们希望将表单中的数据自动封装成一个对象,我们可以使用UpdateModel<T>() 这个方法。它可以讲表单提交过来的数据自动封装为对应的实体对象。这样可以节省我们去封装对象数据的时间。与UpdateModel<T>()相似的还有一个TryUpdateModel() 方法,这个可以捕获相应的封装时候出现的异常,用法如下
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
1 public ActionResult Show(FormCollection formCollection)
2 {
3 Student stu = new Student();
4 stu.Id = 1;
5 stu.Name = "aa";
6
7 UpdateModel(stu, new[] { "Id"});
8 return View("Index");
9 }
上面的方法,UpdateModel 第一个参数是封装表单数据到那个对象中去,后面的这个参数是对应到那个属性。这个时候就要注意,表单的name属性和对象的属性名称就必须相同,这样才能对应数据
3.直接提取表单数据
使用这种方法方式可以将表单中提交的数据直接封装为对象,就和上面说到的UpdateModel 一样。同时表单中输入框的name属性在这个封装的对象中必须存在相同的属性,否则不能封装。
2 {
3
4 return View("Index");
5 }
如果表单提交的是两个对象的数据,有两种方式,一是把这两个对象作为属性封装到一个对象中去。另一种就是在使用acition中的参数来指定:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%using (Html.BeginRouteForm(new { controller = "Show", action = "Home" }))
{%>
<p>
<label>
用户名1:</label><%=Html.TextBox("a.username") %></p>
<p>
<label>
密码1:</label><%=Html.TextBox("a.password") %></p>
<p>
<label>
用户名2:</label><%=Html.TextBox("b.username") %></p>
<p>
<label>
密码2:</label><%=Html.TextBox("b.password") %></p>
<p>
<input type="submit" /></p>
<% }%>
2 {
3 return View("Index");
4 }
以上这种方式就能在表单提交的时候封装两种类型的实体数据 MVC中的这种表单提交方式可以节省很多时间,使程序员更加侧重于业务逻辑的实现,而不是专注程序代码属性数据的封装。相当于WebForm来说,这种方式更加人性化。而且它不会什么那些ViewState的那些一长串而又看不懂的数据,大大减少了页面容量的大小,这也不能说不是提高页面下载速度的一个好办法。