Предотвратить RedirectToAction (), если запрос AJAX - PullRequest
0 голосов
/ 30 декабря 2011

Возьмите, например, следующий код для действия Edit в моем контроллере:

    // POST: /Admin/Text/Edit/5
    [HttpPost]
    [ValidateInput(false)]
    public virtual ActionResult Edit(TextViewModel editing)
    {
        if (!ModelState.IsValid)
            return View(editing);

        Text existing = _repository.Find(editing.Id);

        if (TryUpdateModel(existing)) {
            _repository.Update(existing);
            if(Request.IsAjaxRequest())
                return Content(bool.TrueString);
            else
                return RedirectToAction(pndng.Admin.Text.List());
        }
        else return View(editing);
    }

Я хочу, чтобы это действие выполняло как классические (не AJAX form), так и AJAX (jquery) POST. В случае AJAX POST очень вероятно, что запрос поступает из встроенной формы редактирования. В этом случае действие должно просто вернуть результат Content=Ok. Если мы редактировали модель на странице формы и выполнили классический postback, мы хотим перенаправить пользователя обратно в список содержимого (см. RedirectToAction()).

Однако меня беспокоит пункт if..else. Я хотел бы абстрагировать это в фильтр / атрибут действия. Я хотел бы оставить в вызове перенаправления (так как это по умолчанию), но иметь фильтр действий, чтобы воздействовать на него, если он обнаруживает, что запрос был фактически запросом AJAX, что означает остановку перенаправления и просто возврат ContentResult или JsonResult.

Также не стесняйтесь отвечать, если считаете, что мой рабочий процесс неправильный.

1 Ответ

2 голосов
/ 30 декабря 2011

Вы должны реализовать собственный ResultFilter, чтобы делать то, что вы хотите, реализуя IResultFilter . что-то вроде:

public class AjaxOverrideFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {

    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Result is RedirectResult)
            filterContext.Result = new ContentResult {Content = "Ok"};
    }
}

А затем украсить это действие с [AjaxOverrideFilter].

Это должно переопределить результат, если это ajax-запрос и тип результата был перенаправлением ... По крайней мере, это должно дать вам толчок в правильном направлении. Я не уверен, что это отличный архитектурный подход ...

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