ASP.NETMVC的Controller接收输⼊详解ASP.NET 的Controller要正确的响应⽤户发出的请求就要获取到⽤户输⼊值和传递的参数信息,⽐如:查询参数的值,提交的表单的值或者通过路由系统从URL中获取的值等等。在ASP.NET MVC中有三种⽅式来获取访问这些值:
1、从Controller的上下⽂获取
2、从Action参数中获取
3、利⽤ASP.NET MVC的model 绑定特性
下⾯我就分别对上⾯三种⽅式进⾏介绍。
mvc的controller⼀、从Controller的上下⽂对象获取参数值
⼀旦创建的Controller是从基类Controller中继承的就可以通过Controller的上下⽂获取参数信息,基类Controller我们提供了很多属性:Request,  Response ,  RouteData,  HttpContext, and  Server,每⼀个属性都是Controller的上下⽂对象,它们各针对不同⽅⾯信息。利⽤这些对象可以获取到当前请求的相关变量的值。
⽐如下⾯的⼀个Action⽅法:
1. public ActionResult RenameProduct(){
2. // 通过上下⽂对象获取变量的值
3. string userName = User.Identity.Name;
4. string serverName = Server.MachineName;
5. string clientIP = Request.UserHostAddress;
6. DateTime dateStamp = HttpContext.Timestamp;
7. AuditRequest(userName, serverName, clientIP, dateStamp,"Renaming product");
8.
9. // 通过上下⽂的请求对象获取表单提交的参数值
10. string oldProductName = Request.Form["OldName"];
11. string newProductName = Request.Form["NewName"];
12. bool result = AttemptProductRename(oldProductName, newProductName);
13.
14. ViewData["RenameResult"]= result;
15. return View("ProductRenamed");
16. }
⼆、通过Action参数中获取参数值
在Controller的Action⽅法可以带有参数,ASP.NET MVC框架会⾃动从请求的上下⽂中提取这些参数的值分别对应到Action的参数。这也是可读性最好和最简介的⽅式。
假设之前我们是通过请求下⽂对象来获取参数的值:
1. public ActionResult ShowWeatherForecast(){
2. string city =(string)RouteData.Values["city"];
3. DateTime forDate = DateTime.Parse(Request.Form["forDate"]);
4. // ... implement weather forecast here ...
5. return View();
6. }
接下来我们可能通过Action参数对上⾯进⾏改进:
1. public ActionResult ShowWeatherForecast(string city, DateTime forDate){
2. // ... implement weather forecast here ...
3. return View();
4. }
可以看出采⽤通过Action参数的⽅式⼤⼤的减少了代码量和提⾼了可读性。使⽤参数的形式还有⼀个好处是利于单元测试,因为我们不⽤创建⼀个RouteData和Request对象,直接传递对应参数就可以测试。MVC框架通过检查请求上下⽂对象为这些参数提供值,其中包括以下集合:
Request.QueryString,
Request.Form ,
RouteData.Values
注意:Action参数是不区分⼤⼩写的,⽐如:Action有⼀个参数为city,我们可以通过Request.Form["City"]获取到值。
三、利⽤ASP.NET MVC的model绑定特性获取参数值
基类Controller设置Action参数的值是通过MVC框架中的value providers和model binders两个组件完成的。MVC框架内置的value providers通过从集合, Request.Form,  Request.QueryString,  Request.Files, 和RouteData.Values获取值,然后传递给model binders分别映射到我们的Action相应的参数中去。默认的model binders就可以映射任何的.NET类型的参数,包括基本类型、集合类型和⾃定义的类。你可以看看我之前写的:,以后我会详细的介绍ASP.NET MVC的model绑定特性。