我希望能够在控制器上标记一个动作,以便通过 ajax 调用和 RenderAction 来调用。问题在于这两个属性派生或实现不同的抽象。一种出路是下一个:
[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 future。一个重要的评论为什么这种情况不是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.
这没有任何意义。这两个属性是互斥的。如果一个动作被标记为[ChildActionOnly]
客户端永远无法使用 HTTP 请求(同步或异步)直接访问它。因此,如果您希望使用 AJAX 可以访问某个操作,则永远不应该用[ChildActionOnly]
属性。
我不知道这是什么[AjaxOnly]
属性是以及它来自哪里,但根据它的实现方式,如果它仅依赖于Request.IsAjaxRequest()
方法。例如,如果是这样的:
public class AjaxOnlyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new HttpNotFoundResult();
}
}
}
你可能想像这样调整它:
public class AjaxOrChildActionOnlyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest() &&
!filterContext.IsChildAction
)
{
filterContext.Result = new HttpNotFoundResult();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)