1. 程式人生 > >asp.net mvc(六)

asp.net mvc(六)

tpc nac err 代碼 ida 就是 fin addm title

Action和Filter

Filter在Asp.net MVC中它只能限制於Action,Controller。 繼承於ActionFilterAttribute,且可以覆寫如下幾個重要方法。
1:void OnActionExecuting(ActionExecutingContext):Action執行前的操作

2:void OnActionExecuted(ActionExecutedContext):Action執行後的操作

3:void OnResultExecuting(ResultExecutingContext):解析ActionResult前執行

4:void OnResultExecuted(ResultExecutedContext):解析ActionResult後執行

系統提供的比較常見的Filter:
1:AcceptVerbs
2:ActionName,上面兩個都限制了對Action的訪問條件;
3:OutputCache,設置緩存;
4:ValidateInput,增加數據驗證。

示例:
1:留言簿列表數據:可以這樣寫,也可以省略[AcceptVerbs(HttpVerbs.Get )],它是個默認值。這種訪問是以鏈接形式訪問。

[AcceptVerbs(HttpVerbs.Get )]
public ActionResult Index()
{
var models = inter.FindAllInfo();
return View("Index", models);
}


2: 當創建一則留言時:我們要用HttpVerbs.Post方式。此時的Action需要在提交表單後才會執行對應的Action。

技術分享 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(GuestBookInfo model)
{
try
{
inter.Add(model);
var models = inter.FindAllInfo();
TempData["TempData"] = "已經成功創建";
return RedirectToAction("Index");
}
catch(Exception ex)
{
ModelState.AddModelError("ex",ex);
return View(model);

}
}
技術分享


3:ActionNameAttribute的用法,和 AcceptVerbsAttribute 方式差不多,如果不指定ActionName,則系統會默認找名稱和方法名相同之處的View。

[ActionName ("Edit")]
public ActionResult Edit(int id)


自定義Filter:
這裏創建一個沒有客戶端緩存的NoClientCacheAttribute。需要繼承ActionFilterAttribute,且重寫OnActionExecuting方法。

技術分享 public class NoClientCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Response.CacheControl = "No-Cache";
}

}
技術分享


應用在Action上,特別簡單,像C#中的變通特性用法一樣。

[NoClientCache]
public ActionResult Details(int id)


AcceptVerbs的工作機制。

第一:AcceptVerbsAttribute類。它繼承了ActionMethodSelectorAttribute,重要的方法是重寫了基類的IsValidForRequest方法,這也是起過濾作用的地方。

技術分享 [AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
public sealed class AcceptVerbsAttribute : ActionMethodSelectorAttribute
{
// Fields
[CompilerGenerated]
private ICollection<string> <Verbs>k__BackingField;

// Methods
public AcceptVerbsAttribute(HttpVerbs verbs);
public AcceptVerbsAttribute(params string[] verbs);
private static void AddEntryToList(HttpVerbs verbs, HttpVerbs match, List<string> verbList, string

entryText);
internal static string[] EnumToArray(HttpVerbs verbs);
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);

// Properties
public ICollection<string> Verbs { [CompilerGenerated] get; private [CompilerGenerated] set; }
}

技術分享


第二:IsValidForRequest方法:

技術分享 public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
string httpMethod = controllerContext.HttpContext.Request.HttpMethod;
return this.Verbs.Contains<string>(httpMethod, StringComparer.OrdinalIgnoreCase);
}
技術分享


我們來看這個方法裏有一個this.Verbs,它是一個Request.HttpMethod集合。它是如何初始化的呢?我們來看AcceptVerbsAttribute的構造函數。它會同時調用另外一個構造函數public AcceptVerbsAttribute(params string[] verbs)

public AcceptVerbsAttribute(HttpVerbs verbs) : this(EnumToArray(verbs))
{
}


重要的就是下面的EnumToArray方法和AddEntryToList方法,EnumToArray方法負責收集所有的Request.HttpMethod,AddEntryToList方法是把當前訪問類型同所有Request.HttpMethod做比較,取出它們的交集。

技術分享

internal static string[] EnumToArray(HttpVerbs verbs)
{
List<string> verbList = new List<string>();
AddEntryToList(verbs, HttpVerbs.Get, verbList, "GET");
AddEntryToList(verbs, HttpVerbs.Post, verbList, "POST");
AddEntryToList(verbs, HttpVerbs.Put, verbList, "PUT");
AddEntryToList(verbs, HttpVerbs.Delete, verbList, "DELETE");
AddEntryToList(verbs, HttpVerbs.Head, verbList, "HEAD");
return verbList.ToArray();
}

技術分享

技術分享 private static void AddEntryToList(HttpVerbs verbs, HttpVerbs match, List<string> verbList, string entryText)
{
if ((verbs & match) != 0)
{
verbList.Add(entryText);
}
} 技術分享


再回頭看下IsValidForRequest方法,就很容易理解這個Filer為什麽能夠直到過濾的作用了。

總結:利用Filter的特點,我們可以寫一些擴展性的內容,例如:壓縮頁面的Attibute,無緩存的Attibute等等。
註:本文引用:http://www.rainsts.net/article.asp?id=786


asp.net mvc(六)