1. 程式人生 > >Asp.net Mvc Preview 5 體驗--實現ActionSelectionAttribute來判斷是否為AJAX請求而選擇不同的Action

Asp.net Mvc Preview 5 體驗--實現ActionSelectionAttribute來判斷是否為AJAX請求而選擇不同的Action

ActionSelectionAttribute是ASP.NET MVC Preview 5 提供的一個抽象基類,通過ActionSelectionAttribute的命名我們就可以猜想到這個Attribute是用來選擇(匹配)Action方法的。該抽象類只提供了一個抽象的方法 IsValidForRequest,該方法會在Controller的ActionInvoker被呼叫。如果一個Action加上了該Attribute,那麼只有當IsValidForRequest方法返回true的時候,當前的請求才會匹配該Action。

image

AcceptVerbsAttribute是ActionSelectionAttribute的一個實現,AcceptVerbsAttribute用於對不同的HttpMethod(例如"GET","POST","DELETE"等等)而選擇同一Action的不同操作。

image

例如下面是AcceptVerbsAttribute的一個應用:

image
注意:兩個Edit的方法簽名不能一樣哦。- -

這個的工作原理大概就是,添加了AcceptVerbsAttribute特性的Action都會呼叫IsValidForRequest()來檢查當前的HTTP請求中的HTTPMethod中是否為GET或POST,如果和配置的相符,則該Action就會匹配。如果匹配的Action超過一個(例如你上面兩個都設為"GET"),則會丟擲異常,如果一個都沒有匹配到,則會呼叫Controller中的HandleUnknownAction()方法來處理。

好,下面開始實現我們標題提到的問題。很簡單,就是繼承ActionSelectionAttribute類,並實現它的IsValidForRequest()方法,我麼要暴露一個IsAjax屬性來用於設定該Action是用於Ajax請求還是一般的請求:

GetByAjaxAttribute

嘿嘿,是不是覺得很簡單呢,然後我們再具體實現IsValidForRequest()方法就完事了,完整程式碼如下,都有註釋了:

GetByAjaxAttribute

(對於如何標識是否為Ajax請求,你可以看我的另外一篇文章:一種標記是否為AJAX非同步請求的思路)

該Attribute的使用示例如下:

Code

Enjoy!