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

本文介绍ASP.NET MVC2中自定义Action的方法及其限制条件,并深入探讨了View的实现原理,包括如何通过继承ActionResult来自定义结果类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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)

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值