Использование атрибута childactiononly MVC3 с ajax

Я использую ajax для загрузки частичного представления, чтобы добавить/отредактировать строку в сетке кендо. Когда я нажимаю кнопку редактирования в строке, я хочу также не разрешать пользователю напрямую вызывать действие Home/AddModify из браузера.

Если я поместил [ChildActionOnly] в мое действие "AddModify", это не позволяет мне загружать частичный вид потому что все в вызове ajax, и я не хочу иметь его в представлении где-то вроде @Html.Action("Home/AddModify",model). Я также не хочу загружать его с самого начала при загрузке страницы.

Можно ли вызвать частичный вид, чтобы он просматривался только по требованию (динамически)?

Ответ 1

Что вам нужно, это только атрибут 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()
{

}

Ответ 2

Вы можете использовать метод расширения IsAjaxRequest на 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()
{
}