Я хочу, чтобы иметь возможность отмечать действие на контроллере, вызываемое как из вызовов ajax, так и через RenderAction. Проблема в том, что оба этих атрибута выводят или реализуют различные абстракции. Один из вариантов - следующий:Объединение AjaxOnlyAttribute и ChildActionOnlyAttribute в один фильтр действий
[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 фьючерсов. Важное замечание, почему условие не 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.
Почему? Предположим, что ваше действие повторно используется из разных мест как с помощью RenderAction(), так и с ajax-запросов. Предположим, что они повторно используются на разных страницах, так как smt рисует некоторую стандартную панель инструментов для многих мест и используется немного по-разному в разных контекстах –
@Hohhi, поэтому вы хотите, чтобы ваше действие было доступно только через вызов AJAX или как действие Child ? –
Точно, спасибо за ваше предложение, я бы обновил вопрос и рассказал, как далеко я за какое-то время заработал –