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