使用带有ajax的MVC3 childactiononly属性

时间:2013-03-18 09:05:55

标签: ajax asp.net-mvc-3

我正在使用ajax加载局部视图,以便在kendo网格中添加/编辑一行。当我按行中的编辑按钮时,我也想让用户不要直接从浏览器调用Home/AddModify操作。

如果我将[ChildActionOnly]添加到我的“AddModify”操作中,则不允许我加载局部视图 因为所有内容都在ajax调用中,我不希望在视图中使用@Html.Action("Home/AddModify",model)。我也不想在加载页面时从头开始加载它。

我是否可以调用局部视图,以便仅按需查看(动态)?

2 个答案:

答案 0 :(得分:19)

您需要的是仅限AJAX属性查看this question

声明它就像

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    {
        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
        }
    }

并像

一样使用它
[AjaxOnly]
public ActionResult ajaxMethod()
{

}

答案 1 :(得分:3)

您可以在HttpRequestBase上使用IsAjaxRequest扩展方法。

它不会阻止每个用户调用它(在公共访问之前你无法阻止它们)(因为它们可以将标题修改为任何内容),但是对于一般用途它可能对你有好处。

你可以制作一个动作过滤器:

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()
{
}