窥探MVC中action返回类型


一、返回类型的简介

MVC 默认返回类型都基于ActionResult抽象类,继承而来。

MVC Action方法返回类型存在一个共同点,最终都是通过respone.write(“输出信息”),反馈给浏览器

MVC框架提供默认以下几种Action返回类型

类型名

功能
ActionResult

基础类型-可以返回任意继承此类的新类型
FileResult

输出二进制,response的编码方式为二进制
JavaScriptResult

返回一个javascript脚本,并且客户端可以进行执行操作
RedirectResult

重定向到一个新的URL地址进行访问
ContentResult

返回用户定义的内容文件
EmptyResult

返回一个空给客户端
FileContentResult

返回文件内容给客户端
HttpStatusCodeResult

返回http状态码
HttpNotFoundResult

返回http没有发现页面的提示信息
HttpUnauthorizedResult

返回没有授权提示
FilePathResult

返回文件路径
JsonResult

返回JSON对象
FileStreamResult

返回文件流对象
ViewResult

返回一个web页面
RedirectToRouteResult

根据路由规则重定向系统访问
PartialViewResult

返回部分视图,常用于控件操作

mvc-actionResult


二、返回类型原理简介

actionResult类简介

actionResult抽象类,包含一个方法 ExecuteResult ,继承此类,只需实现此方法即可


 	public abstract class ActionResult
	{
		public abstract void ExecuteResult(ControllerContext context);
	}

ContentResult类简介


 
  public class ContentResult : ActionResult
	{
		public string Content
		{
			get;
			set;
		}

		public Encoding ContentEncoding
		{
			get;
			set;
		}

		public string ContentType
		{
			get;
			set;
		}

		public override void ExecuteResult(ControllerContext context)
		{
			if (context == null)
			{
				throw new ArgumentNullException("context");
			}
			HttpResponseBase response = context.HttpContext.Response;
			if (!string.IsNullOrEmpty(this.ContentType))
			{
				response.ContentType = this.ContentType;
			}
			if (this.ContentEncoding != null)
			{
				response.ContentEncoding = this.ContentEncoding;
			}
			if (this.Content != null)
			{
				response.Write(this.Content);
			}
		}
	}

通过contentResult类,我们可以看出actionResult的最终结果就是采用response.write 输出html至客户端。


三、自定义MVC返回类型

   #region 自定义actionResult

    public class newActionResult : ActionResult
    {


        private string   Content_;
        public string Content {
            get { return Content_; }
            set { Content_ = value; }
        }

        public newActionResult(string s)
        {
            Content_ = s;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            HttpResponseBase response = context.HttpContext.Response;
            response.Write(this.Content); 
        }
    }

    #endregion 


    //----------调用方法

       public newActionResult roleTestInfo()
        {
            return new newActionResult("这是一个自定义actionResult");
        }