asp.net mvc(六)

來源:互聯網
上載者:User

       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
 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.