作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够在 Controller 上标记一个 Action ,以便从 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 futures。为什么条件不是 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.
最佳答案
这没有任何意义。这两个属性是互斥的。如果一个 Action 被标记为 [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();
}
}
}
关于c# - 将 AjaxOnlyAttribute 和 ChildActionOnlyAttribute 合并到一个 Action 过滤器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534196/
我希望能够在 Controller 上标记一个 Action ,以便从 ajax 调用和通过 RenderAction 调用。问题是这两个属性都派生或实现了不同的抽象。一个出路是下一个: [AjaxO
我是一名优秀的程序员,十分优秀!