Как вы обрабатываете Ajax-вызовы контроллера в ASP.Net MVC - PullRequest
1 голос
/ 11 сентября 2010

Одной из прелестей MVC является возможность использовать действия как для обычных веб-вызовов, так и для вызовов Ajax. Но при этом мне немного неудобно с моим кодом. Я хотел бы знать, что думают другие люди.

Итак, я хочу просмотреть детали элемента в списке. Я создал представление Details. Я также решил использовать hijaxing - если у пользователя включен Javascript, я хочу, чтобы форма Details была всплывающей. Так что для Details.aspx мне нужен полный html, но если это ajax-запрос, мне нужны только элементы формы. Итак, вот как я написал свой метод контроллера:

public ActionResult Details(int id)
{
    if (Request.IsAjaxRequest())
    {
        return PartialView(GetAjaxModel());
    }
    else
        return View(GetModel());
}

Это работает, но всякий раз, когда у меня есть гигантское выражение «если», окружающее весь мой код, это беспокоит меня. Как мне избавиться от этого и / или сделать код лучше?

Я также мог бы написать отдельный метод, называемый AjaxDetails, но я действительно хотел бы написать следующее:

public ActionResult Details(int id)
{
        return View(GetModel());
}

[Ajax]
public ActionResult Details(int id)
{
    return View(GetAjaxModel());
}    

Но, насколько мне известно, нет атрибута для фильтрации Ajax и обычных вызовов.

Как вы пишете свои Ajax-звонки?

UPDATE Clicktricity действительно имеет правильный ответ. Однако еще одно изменение заключается в том, что, поскольку два метода контроллера не могут иметь одинаковую сигнатуру, мне нужно написать код контроллера следующим образом:

public ActionResult Details(int id)
{
        return View(GetModel());
}

[AjaxRequest]
[ActionName("Details")]
public ActionResult DetailsAjax(int id)
{
    return PartialView(GetAjaxModel());
}    

1 Ответ

3 голосов
/ 11 сентября 2010

Вы правы, что не существует фильтра, который бы это делал - но в типичной манере MVC нет причины, по которой вы не можете написать свой собственный.

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

Тогда вы можете использовать [AjaxRequest] в своих методах действий.

(Обратите внимание, я не проверял это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...