相关文章推荐
瘦瘦的野马  ·  SQL ...·  2 周前    · 
安静的皮蛋  ·  Visual ...·  1 周前    · 
酷酷的金鱼  ·  ASP.NET Core 实战-7.使用 ...·  1 周前    · 
玩足球的酱牛肉  ·  Cannot locate a ...·  5 月前    · 
失恋的马铃薯  ·  python ...·  6 月前    · 
叛逆的烈酒  ·  linux cat 不换行 - ...·  1 年前    · 
兴奋的草稿本  ·  how to print void ...·  1 年前    · 

这篇文章我将和大家一起来讨论ASP.NET MVC框架中的Controller和Action。本篇文章包含以下内容:
1. 了解Controller
2. Controller接收请求参数
3. 返回ActionResult

了解Controller

当用户请求一个URL地址时,路由系统会将该请求交给一个Controller来进行相应。一般情况下,Controller需要做的是:接收到相关参数,调用下层的Model来处理特定业务逻辑,然后返回一个ActionResult。

在MVC模式中,Controller处于一个中心地位,连接着Model和View。在理想情况下,Web应用程序应该做到“胖模型,瘦控制器,哑视图”。胖模型是指,所有的业务逻辑都存在于Model中,功能强大并且具有比较高的内聚性,瘦控制器是指,控制器的代码应该尽量的精简,不包含任何业务逻辑,也不包含任何界面逻辑,而仅仅包含对参数的提取和对Model以及View的调用。哑视图是指,View对所有的业务逻辑一无所知,仅仅是呈现一个页面,需要的所有数据都由Controller传递过来,不直接调用Model层来获取数据,更不直接访问数据库。

Controller的两个最重要的工作就是:1.处理Web请求,并且接收所有传递的参数。2.相应Web请求,返回特定的ActionResult。

Controller接收请求参数

在Controller的Action中如果想获取本次请求的参数,最直接的方式是可以通过Context的对象来获取,也可以通过Action方法的参数来直接接收(Action方法的参数是通过ModelBinder来赋值的,无需程序员编写任何代码)

从上下文对象中获取参数

通常情况下,我们的controller类都是继承自 System.Web.Mvc.Controller 类,这个父类中有好几个对象,我们可以在自己的控制器中直接使用,如,Request , Response , RouteData , HttpContext , Server, Session 等。下面列举一些常用的情况

属性 类型 描述
Request.QueryString NameValueCollection 从本次Get请求中获取查询字符串的变量和值
Request.Form NameValueCollection 从本次Post请求中获取变量和值
Request.Cookie HttpCookieCollection 本次请求中,浏览器发送的Cookie值
Request.Uri Uri 请求的URL路径
RouteData.Values RouteValueDictionary 路由参数
HttpContext.Session HttpSessionStateBase 获取session中的键值
User IPrincipal 获取当前用户的授权信息

我们在 action 中会这样用

public ActionResult Index()
     string info = Request.QueryString["info"] ;
     ViewBag.Info = info ;
     return View();

从Action方法的参数中获取

当处理请求时,MVC框架会自动从Request.QueryString ,Request.Form ,Request.RouteData.Values 等集合中根据参数名为参数赋值,这些参数不能包含 out 和 ref 关键字 ,大小写不敏感 。

public ActionResult Index( string info )
    ViewBag.Info = info ;
    return View();

绑定参数大概经过这么一个过程,首先,由 data provider 去从上述的几个几何对象中取出值 ,然后赋给data binder ,由 data binder 进行验证、类型转换等操作,然后把值赋给 action 的参数 这个参数的类型可以是任意的 .net 类型 ,具体的绑定方式会在以后的文章中具体说。如果 model binder 无法为某个引用类型的参数找到对应的值,那么会给这个参数赋值为null,如果是值类型的话,就会抛出异常。为了避免这种情况的发生,我们可以手动地为 action 的参数赋默认值,或者给参数定义为可为空的类型,如下面代码所示:

public ActionResult Index(string info ="Hello , World !",int number=0 , double? doubleData)
    ViewBag.Info = info ;
    return View();

以上这个过程称为Model Binding,MVC框架不仅可以为为简单的参数赋值,还可能为复杂的对象赋值,也可以给数组和集合赋值,想了解更多请参见 ASP.NET MVC Model Binding

返回ActionResult

当Controller处理完请求之后,需要返回一个结果,比如,返回一个HTML页面、一个文件、一个HTTP Code等。我们可以让 Action 方法返回一坨 HTML标签,但是,这样子写的话不仅效率低,而且不容易维护,也不利于单元测试。我们可以简单地返回一个 ActionResult 对象。MVC框架包含了一系列内置的返回类型,全都继承自ActionResult类,如下所示:

类名描述方法名
ViewResult显示指定的或默认的View模板View
PartialViewResult显示指定的或默认的部分页模板PartialView
RedirectToRouteResult重定向RedirectToAction , RedirectToActionPermanent ,RedirectToRoute , RedirectToRoutePermanent
RedirectRestult重定向Redirect ,RedirectPermanent
ContentResult返回纯文本信息Content
FileResult返回二进制文件到浏览器File
JsonResult将一个.net 对象序列化为Json字符串返回Json
HttpUnauthorizedResult返回HTTP 401
HttpNotFountResult找不到指定文件 404HttpNotFound

返回ViewResult时,向页面传递数据

有三种方式可以将数据传递到页面上

向视图传递一个 Model 对象

接收数据的视图应该是一个强类型的视图。

public ActionResult About()
    DateTime date = DateTime.Now;
    return View( date );

视图页面中的调用方式如下:

@model DateTime
@Model.Month
通过ViewBag向视图传递数据。

由于ViewBag是 dynamic 类型的,所以,我们可以给 ViewBag 赋任何属性的值。dynamic类是.net 4.0中的新特性,如果一个对象被声明为了dynamic类型,那么,与该对象有关的任何代码都不参与编译,如果有错误时,会在运行时抛出异常。

public ActionResult About()
    ViewBag.Date = DateTime.Now;
    ViewBag.Message=“hello , world!”;
    return View();

视图页面中的调用方式如下:

@ViewBag.Date
@ViewBag.Message
通过 ViewData 向视图传递数据。
public ActionResult About()
   ViewData["Date"] = DateTime.Now;
   ViewData["Message"]=“hello , world!”;
   return View();

视图页面的调用方式(需要强制类型转换)

@ViewData["Date"]
@ViewData["Message"]

返回 RedirectResult 对象。

RedirectResult 分为两种,第一种是通常意义上的跳转,第二种是永久跳转,既,在浏览器中通过“后退“是退不回来的,这种跳转的方法名上都是以 “Permanent” 结尾的,例如,RedirectToActionPermanent , RedirectToRoutePermanent 等。各种方法只需要根据重载的参数即可使用,此处就不做介绍了。

返回 ContentResult 对象

如果想返回文本信息,如 XML , HTML ,或者纯文本信息,可以返回ContentResult对象。

return Content("This is content", "text/plain", System.Text.Encoding.Default);

返回 JsonResult 对象

Json是一种目前比较流行的跨平台的纯文本格式,一般用于Ajax技术。

return Json(JsonData) ;

返回 FileResult 对象

return File("fileName" , "contentType" ,"downloadName") ; 

返回错误信息或返回HTTP代码

return new HttpStatusCodeResult(404, " URL not found 。。。") ;
return HttpNotFound() ;
这篇文章我将和大家一起来讨论ASP.NET MVC框架中的Controller和Action。本篇文章包含以下内容: 1. 了解Controller 2. Controller接收请求参数 3. 返回ActionResult了解Controller当用户请求一个URL地址时,路由系统会将该请求交给一个Controller来进行相应。一般情况下,Controller需要做的是:接收到相关参
Controller 是 SpringMVC的控制层。Action 是 Structs 的控制层。 SpringMVCController和Struts2的Action均是实现MVC模式的控制层。两者区别如下: 1.SpringMVC可精确控制到方法上,Controller可以单例开发,Struts2的Action则是多例prototype开发,基于类进行拦截请求的。 2.Spri...
作者:张米,撰写时间:2019年4月28日 当新建一个视图,在视图上写好元素后,刷新时报资源不存在的错时,可以去应用程序文件夹App_Start的设置路由的子文件夹看看。看什么呢? 看controller的名字和action的名字对不对,怎么看呢? 在知道怎么看contr...
public class ScoreController : Controller public ActionResult Index(string name, int age) #region View()的三种写法 return View();//返回Index视图 MVCActionResult是Action的返回结果。ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等。ActionResult是一个抽象类,它定义了唯一的ExecuteResult方法,参数为一个ControllerContext,下面为您介绍MVC中的ActionResult 的用法 二、什么... asp.net mvcControllerAction Controller 类必须以字符串 "Controller" 做类名称的结尾,字符串 Controller 之前的字符串为 Controller 的名称,类中的方法名为 Action 的名称 Action 可以没有返回值。如果 Action 要有返回值的话,其类型必须是 ActionResult
一. MVC 关于Action的参数 ASP.Net MVC会自动对参数做类型转换; 对于boolean类型的参数(或者Model的属性),如果使用checkbox,则value必须是"true",否则值永远是false。对于double、int等类型会自动进行类型转换。 一个Controller可以有多个方法,这些方法叫Action。通过“Controller名字/方法名”访问的时候就会执行...
```csharp var currentController = RouteData.Values["controller"].ToString(); var currentAction = RouteData.Values["action"].ToString(); 3. 获取当前参数: ```csharp var currentParam = Request.QueryString.ToString(); 另外,如果需要获取当前路由的完整信息,可以使用以下代码: ```csharp var currentRouteData = RouteTable.Routes.GetRouteData(HttpContext.Current); var currentController = currentRouteData.Values["controller"].ToString(); var currentAction = currentRouteData.Values["action"].ToString(); var currentParam = string.Join(",", currentRouteData.Values.Select(x => x.Key + "=" + x.Value)); var currentUrl = HttpContext.Current.Request.Url.AbsoluteUri;