MVC 学习第十节 请求Controller
其实我们通常遇到的请求方式无非get/post,但是有很多Web开发人员仍然对二者分不清。
get即通过URL中的QueryString向服务器端传值的方式,它的数据是可见的,可post则是通过一个postdata包向服务器传值,post方式可以传送更多数据(如上传文件),也更安全(如登录)。
本文将演示各种通过客户端页面(即最终生成的页面)向Controller提交请求以及在Controller中接受的方式。
约定
本文所有的示例都将是演示一个登录过程,但并不关注判断过程,所以判断方面仅做简单的IF操作。
而提交的实体我们新建一个Account类。
它的内容如下:
/// <summary> /// 用户账户的实体类 /// </summary> public class Account { /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } }
文中大多数示例使用了Account类,但并不是所有的示例都使用了Account。
在文中我们并不关注提交信息的页面的Controller,仅关注处理信息的Controller。
而Controller中存在这样一个方法,用于辅助判断:
/// <summary> /// 一个辅助判断的方法 /// </summary> /// <param name="userName">用户名</param> /// <param name="password">密码</param> /// <returns></returns> string AreEquals(string userName,string password) { return (userName.ToLower() == "admin" && password == "123456").ToString(); }
以Post提交的数据来看传递
之所以这里先说Post是因为相对于Get方式来说Post的情况更全,说明了Post的情况Get也就差不多了。
View:
@* 这里说明一下你Html.TextBox("username") 这个输入框的名字要和你定义的Account的UserName 名字相同,忽略大小写,不然程序会出错误*@
@using (Html.BeginRouteForm(new { controller = "home", action = "process" })) { <p> <label>用户名:</label>@Html.TextBox("username") </p> <p> <label>密码:</label>@Html.TextBox("password") </p> <p> <input type="submit" /></p> }
1.从最基本的开始,使用Request获取提交的信息
/// <summary> /// 处理请求的Action /// </summary> /// <returns></returns> public ActionResult Process() { return Content( AreEquals(Request.Form["username"], Request.Form["password"]) ); }
这个无多解释,通过Request.Form来获取表单提交我想是最基本的方法之一,如果您对这种方法不了解的话,那么就说明您的ASP.NET基础有待提交,可以查看ASP.NET五大对象的相关文章。
2.通过Action参数提交
相比之下这个可能更加漂亮些。
1 /// <summary> 2 /// 处理请求的Action 3 /// </summary> 4 /// <param name="userName">这两个参数务必与表单中的名称一致</param> 5 /// <param name="password"></param> 6 /// <returns></returns> 7 public ActionResult Process(string userName, string password) 8 { 9 return Content( 10 AreEquals(userName, password) 11 ); 12 }
3.UpdateModel来获取传递
/// <summary> /// 处理请求的Action /// </summary> /// <returns></returns> public ActionResult Process() { var a = new Account(); UpdateModel(a);//确定a包含Password及UserName这两个属性即可,否则抛出异常 return Content( AreEquals(a.UserName, a.Password)); }
当然我们这里很容易出现异常所以可以使用另一个方法来替代,TryUpdateModel:
1: /// <summary> 2: /// 处理请求的Action 3: /// </summary> 4: /// <returns></returns> 5: public ActionResult Process() 6: { 7: var a = new Account(); 8: //这样就可以在没有成功转换时使用另一种处理方式 9: return Content( 10: TryUpdateModel(a))?AreEquals(a.UserName, a.Password):bool.FalseString 11: ); 12: }
上面这种UpdateModel的方法已经很简单了,可是ASP.NET MVC为我们提供了更简单的方式:
4.使用绑定
1: /// <summary> 2: /// 处理请求的Action 3: /// </summary> 4: /// <returns></returns> 5: public ActionResult Process(Account a) 6: { 7: return Content( 8: AreEquals(a.UserName, a.Password) 9: ); 10: }
就是这么简单
可能存在的问题
我们在提交表单时可能有多个Account对象,这种情况下我们应该怎么办呢。
请看下面:
View:
@using (Html.BeginRouteForm(new { controller = "home", action = "process" })) { <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> }
注意这里的表单元素的Name、
下面是处理的Action代码:
1: /// <summary> 2: /// 处理请求的Action 3: /// </summary> 4: /// <returns></returns> 5: public ActionResult Process(Account a ,Account b) 6: { 7: //处理代码 8: return View(); 9: }
这就一切OK了