MVC – Action和ActionResult

Action

 定义在Controller中的Action方法重返ActionResult对象,ActionResult是对Action执行结果的包裹,用于最后对请求举办响应。HTTP是一个独自的运用请求/回复信息交换格局的网络协议,Web服务器在收取并拍卖来自客户端的请求后会按照处理结果对请求予以响应,最后的拍卖显示在针对对象Action方法的实行。

 public class MyController : Controller {
     public ActionResult MyActionMethod() {
         ...
         return xxx;
     }
 }

Ajax,对Action方法的渴求:

  •  public的实例方法,再次来到ActionResult类型;
  •  不可以是范型方法,不可以被重载;
  •  没有标明NonActionAttribute特性(NoAction);

对controller类的渴求:

  • MVC中具有的controller类必须以”Controller”后缀来命名;

    public abstract class ControllerBase : IController
    {

     public ControllerContext ControllerContext { get; set; }
    

    }
    public abstract class Controller : ControllerBase, …
    {

      public HttpResponseBase  Response { get; }
      public HttpContextBase  HttpContext { get; }
    

    }

  • 直接运用只读的Response属性表示近年来的HttpResponse对象,实现对请求的响应;

  • 直接利用表示如今HTTP上下文的HttpContext属性和象征Controller上下文的ControllerContext属性获取用于响应请求的HttpResponse对象;

 实际中,并不接纳HttpResponse直接对请求响应,而是将请求响应落实在一个ActionResult对象中,最后的请求响应落实在架空方法ExecuteResult()中。

    HttpResponseBase response = context.HttpContext.Response 

ActionResult

 抽象类,ActionResult是Controller中Action的回到类型,Action方法可以再次回到一个直/直接从ActionResult抽象类继承的类型。默认ControllerActionInvoker调用ActionResult.ExecuteResult()方法生成请求响应结果。

namespace System.Web.Mvc {
    public abstract class ActionResult {
        protected ActionResult();  // 构造函数
        public abstract void ExecuteResult(ControllerContext context);  // 用于子类重写
    }
}

EmptyResult

 空结果。假诺Action方法再次来到NULL或void,MVC将其更换成EmptyResult对象。 

public class EmptyResult : ActionResult {
     public EmptyResult();
     public override void ExecuteResult(ControllerContext context);
}

ContentResult

 用户定义的纯文本内容类型,调用Response.Write()将字符串直接向客户端输出。倘使Action方法重返非ActionResult对象,MVC将简单地以回到对象的ToString()内容为底蕴暴发一个ContentResult对象并重回。

public class ContentResult : ActionResult {
     public ContentResult();    
     public Encoding ContentEncoding { get; set; }
     public string ContentType { get; set; }
     public string Content { get; set; }  
     public override void ExecuteResult(ControllerContext context);
}

内部,contentType是文档类型,contentEncoding是编码形式。

 抽象类Controller定义两个重载方法遵照指定的始末、编码格局和传媒类型创制相应的ContentResult对象:

public abstract class Controller : ControllerBase, ... {
     protected ContentResult Content(string content, xxx);    
     protected virtual ContentResult Content(string content, string contentType, Encoding contentEncoding);
}

JsonResult

 体系化的Json对象,将点名对象系列化为Json字符串,再调用Response.Write()将字符串写入到HTTP输出流。MVC将Response.ContentType设置为application/json,通过JavaScriptSerializer类将点名对象序列化为Json表示方法。默认情状下,MVC不容许GET请求重临Json结果,可将JsonRequestBehavior属性设置为AllowGet以解除限制。

public class JsonResult : ActionResult {
     public JsonResult();
     public Encoding ContentEncoding { get; set; }
     public string ContentType { get; set; }
     public object Data { get; set; }
     // 指示是否允许来自客户端的 HTTP GET 请求
     public JsonRequestBehavior JsonRequestBehavior { get; set; }
     public override void ExecuteResult(ControllerContext context);
}
 // 允许/拒绝支持对HTTP-GET请求的响应
 public enum JsonRequestBehavior{ AllowGet, DenyGet }

 CLR对象与Json格式字符串的体系化/反连串化过程由连串化器JavaScriptSerializer来形成:

public class JavaScriptSerializer {
     public int MaxJsonLength {  get; set; }   // Json格式字符串
     public int RecursionLimit { get; set; }
     public string Serialize(object obj);   // 序列化 
     public void Serialize(object obj, StringBuilder output);
     public object Deserialize(string input, Type targetType);   // 反序列化    
     public object DeserializeObject(string input);
}

 抽象类Controller定义四个重载方法按照指定的始末、编码模式、媒体类型和JsonRequestBehavior值创建相应的JsonResult对象:

public abstract class Controller : ControllerBase, ... {
     protected internal JsonResult Json(object data, xxx);
     protected internal virtual JsonResult Json(object data, xxx);
}

 Json

 JavaScript Object
Notation,轻量级的数据互换格式,是JavaScript的原生格式,采取完全独立于言语的文本格式,是优质的数据沟通语言。Json是一点一滴动态的,允许在Json的布局中间改变多少的意味方法。

  • 容易编写阅读、解析生成,提高网络传输速率;
  • 数量在键值对中,数据由逗号隔开,花括号保存对象,方括号保存数组;
  • Json格式和XML格式可以并行转化;

JavaScriptResult

 允许在服务端动态生成一段JS脚本用于客户端执行之,并以此作为请求的响应。ExecuteResult()方法将脚本内容写入当前HttpResponse,并将媒体类型设置为“application/x-javascript”。再次回到类型为JavaScriptResult的Action方法一般用于拍卖Ajax请求。

public class JavaScriptResult : ActionResult {
     public JavaScriptResult();
     public string Script { get; set; }   // JS脚本
     public override void ExecuteResult(ControllerContext context);
}

 抽象类Controller中定义了一个JavaScript方法依据指定的脚本字符串创立一个JavaScriptResult对象:

public abstract class Controller : ControllerBase, ... {
     protected virtual JavaScriptResult JavaScript(string script);
 }

ViewResult

 HTML的页面内容,用于展现数据。由于Controller和相关瑟维斯(Service)已经处理到位业务逻辑并将结果打包成Model实体,View需要取得Model并将其转为Html。

参考:

 

相关文章