在ajax中使用MVC3 childactiononly属性
我使用ajax加载局部视图,以便在剑道网格中添加/编辑行。当我按下行中的编辑按钮时,我希望不允许用户从浏览器直接调用在ajax中使用MVC3 childactiononly属性,ajax,asp.net-mvc-3,Ajax,Asp.net Mvc 3,我使用ajax加载局部视图,以便在剑道网格中添加/编辑行。当我按下行中的编辑按钮时,我希望不允许用户从浏览器直接调用Home/AddModify操作 如果我将[ChildActionOnly]放在“AddModify”操作中,则不允许加载局部视图 因为一切都在ajax调用中,我不希望它像@Html.Action(“Home/AddModify”,model)一样出现在视图中。我也不想在加载页面时从一开始就加载它 我是否可以调用局部视图,以便只按需(动态)查看它?您需要的是一个只支持AJAX的属性
Home/AddModify
操作
如果我将[ChildActionOnly]
放在“AddModify”操作中,则不允许加载局部视图
因为一切都在ajax调用中,我不希望它像@Html.Action(“Home/AddModify”,model)
一样出现在视图中。我也不想在加载页面时从一开始就加载它
我是否可以调用局部视图,以便只按需(动态)查看它?您需要的是一个只支持AJAX的属性看看 宣布它像
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
}
}
像这样使用它
[AjaxOnly]
public ActionResult ajaxMethod()
{
}
您可以在HttpRequestBase上使用扩展方法
它不会阻止每个用户调用它(在它公开访问之前,您无法阻止它们)(因为它们可以将标题修改为任何内容),但对于一般用途,它可能对您有好处
您可以制作一个actionfilter:
public class RestrictToAjaxAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
throw new InvalidOperationException("This action is only available via ajax");
}
}
}
并将此属性置于操作之上:
[RestrictToAjax]
public ActionResult YourAction()
{
}
在关于mvc 4的pluralsight教程中,我知道这一点,但我没有想到这一点。对于我来说,使用IsAJaxRequest就足够了,在不是ajax的情况下放置消息或错误页面是可以的。非常感谢IDEA。如果我想返回html页面而不是抛出错误,我该怎么做呢?目前我使用的是filtercontext.Httpcontext.Response.Redirect(“/Infrastructure/InvalidOperation”),您可以将ActionResult实例分配给filtercontext.Result