我希望能夠在控制器上標記一個動作,以便通過ajax調用和通過RenderAction調用。問題是這兩個屬性都派生或實現了不同的抽象。下一步是出路:將AjaxOnlyAttribute和ChildActionOnlyAttribute合併爲一個動作過濾器
[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }
但是,這並不是完整的。
的AjaxOnly屬性,我說的是:
public sealed class AjaxOnlyAttribute : ActionFilterAttribute
{
#region Public members
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
filterContext.Result = new HttpNotFoundResult();
}
#endregion
}
這種方法是從MVC3期貨拍攝。爲什麼條件不filterContext.HttpContext.Request.IsAjaxRequest()
是由開發團隊製作,並表示下一個重要的註釋:
// Dev10 #939671 - If this attribute is going to say AJAX *only*, then we need to check the header
// specifically, as otherwise clients can modify the form or query string to contain the name/value
// pair we're looking for.
爲什麼?假設您的動作通過RenderAction()和ajax請求從不同的地方重新使用。假設它們在不同的頁面上被重複使用,就像在許多地方繪製一些標準的工具面板一樣,並且在不同的環境下使用略有不同 – 2012-03-02 13:50:43
@Hohhi,所以你希望你的行爲只能通過AJAX調用或者作爲Child action ? – 2012-03-02 14:00:04
的確如此,感謝您的建議,我會更新問題並告訴我在一段時間內有多遠 – 2012-03-02 14:06:49