[ASP.NET MVC2 系列] Action要求与View本质

[ASP.NET MVC2 系列] 
     [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》 
     [ASP.NET MVC2 系列] ASP.Net MVC教程之《ASP.NET MVC 概述》
     [ASP.NET MVC2 系列] 理解MVC应用程序的执行过程
     [ASP.NET MVC2 系列] ASP.NET MVC Routing概述 
     [ASP.NET MVC2 系列] ASP.NET MVC 之如何创建自定义路由约束 
     [ASP.NET MVC2 系列] Action要求与View本质
     [ASP.NET MVC2 系列] Action Filters以及自定义OutputCache ActionFilterAttribute事件发生次序

 

 

创建一个自定义action必须满足的要求

 

方法必须为公共的.
方法不能为静态方法.
方法不能是Control基类中的方法(如:ToString,GetHashCode等)

方法不能为扩展方法.
方法不能为一个构造函数 ,getter,  setter.
方法不能包含ref 或 out 参数.

 

使用 NonActionAttribute 特性将阻止该action被调用

namespace MVCViewAndAction.Web.Controllers
{
    [HandleError]
    
public class UserDemoController : Controller
    {
        
//
        
// GET: /UserDemo/
        
//自定义一个简单的方法
        [NonAction]  
        
//public sealed class NonActionAttribute表示一个特性,该特性用于指示控制器方法不是操作方法。
        public string DisplayString()
        {
            
return "this is a demo string!";
        }
     }
}

 

理解Views

 

相对于 ASP.NET 与 Active Server Pages, ASP.NET MVC 并不包含任何直接对应的一个页面。在ASP.NET MVC 应用程序中,你键入浏览器地址栏中的URL在磁盘上并没有相应的一个页面,该URL被映射为 controller actions。与页面page最相近的正是我们所说的View。

 

最基本的如下:

 public ActionResult Index()
 {
      
return View();
 }

 

 

为了探究view的本质,以显示如下的结果:

 public class UserDemoController : Controller
    {
        
public RssActionResult RssShow()
        {
            
return new RssActionResult();
        }
    }

 

 

我们需要创建一个继承ActionResult的RssActionResult类,如下所示:

 

namespace MVCViewAndAction.Common
{
    
/*
     * System.Web.Mvc
    public abstract class ActionResult
    {
        protected ActionResult();
        public abstract void ExecuteResult(ControllerContext context);
    }
*/
    
public class RssActionResult:ActionResult
    {
        
public RssActionResult()
        { 
        }
        
//
        public override void ExecuteResult(ControllerContext context)
        {
            
if (context == null)
            {
                
throw new ArgumentNullException("ControllerContext is null!");
            }
            HttpResponseBase response 
= context.HttpContext.Response;
            Rss rss 
= new Rss();
            rss.CreateSampleRss(response);
        }
    }

 

 

通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,ExecuteResult(ControllerContext context)启用对操作方法结果的处理。

 

附:ExecuteResult()中的rss.CreateSampleRss(response)方法通过利用HttpResponseBase来处理响应流。

public void CreateSampleRss(HttpResponseBase response)
        {
            XmlTextWriter writer 
= new XmlTextWriter(response.OutputStream, System.Text.Encoding.UTF8); 
            WriteRssHeader(writer);
            
for (int i = 0; i < 50;i++ ) 
            {
                WriteRssItem(writer, 
"demo title: jasenkin" + i.ToString(), http://jasenkin/"decription: --->" + i.ToString());
            }
            WriteRssBottom(writer);
            writer.Flush();
            writer.Close();
            response.ContentEncoding 
= System.Text.Encoding.UTF8;
            response.ContentType 
= "text/xml";
            response.Cache.SetCacheability(HttpCacheability.Public);
            response.End();
        }

 

 

 执行结果如下:

 

一个典型的Action可能接收用户输入,准备合适的响应数据, 然后通过返回一个Result的类型(如上例中的RssActionResult),系统将自动调用这个Result类型(如上例中的RssActionResult)的ExecuteResult(context)来响应浏览器请求,呈现的就是我们所说的View了(如上图)。

这仅仅是一个继承自actionresult的自定义类,其中的ExecuteResult()方法才是该类的关键之处。

 

源代码:MVCViewAndAction.rar(vs2010)

 

 
posted @ 2010-09-08 16:02  jasen.kin  阅读(6129)  评论(9编辑  收藏  举报