Является ли шаблон PRG несовместимым с сообщениями формы AJAX? - PullRequest
7 голосов
/ 31 июля 2010

Я использую шаблон post-redirect-get для всех моих форм, но теперь мне нужно добавить функциональность AJAX, чтобы улучшить взаимодействие с пользователем.Мои первые мысли заключаются в том, что они не смешиваются.

В сценарии PRG у меня будет действие post, которое затем будет перенаправлено обратно на мое действие get в случае ошибки проверки или перенаправлено на мой успехиначе получите действие.

В сценарии AJAX мне нужно вернуть частичное представление в любом случае.Более типично, я бы сначала проверил, является ли это AJAX-запросом.Если это так, верните частичное представление, иначе верните представление.

Есть мысли или предложения?

Ответы [ 2 ]

4 голосов
/ 23 августа 2010

Мы используем Post-Redirect-Get в нашем приложении. Вот суть того, что мы делаем, который основан на методе Request.IsAjaxRequest() и разбивает ваши представления на .aspx, каждый из которых содержит .ascx, так что каждое действие can может быть вызвано как синхронно, так и асинхронно (т.е. через Ajax).

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Foo foo)
{
    try
    {
        // Save the changes to the data store
        unitOfWork.Foos.Attach(foo);
        unitOfWork.Commit();

        if (Request.IsAjaxRequest())
        {
            // The name of the view for Ajax calls will most likely be different to the normal view name 
            return PartialView("EditSuccessAsync");
        }
        else
        {
            return RedirectToAction("EditSuccess");
        }
    }
    catch (Exception e)
    {
        if (Request.IsAjaxRequest())
        {
            // Here you probably want to return part of the normal Edit View
            return PartialView("EditForm", foo);
        }
        else
        {
            return View(foo);
        }
    }
}

У нас также есть небольшой вариант, когда мы специально ловим RulesException (от xVal ), чтобы трактовать ошибки проверки модели иначе, чем другие «более серьезные» исключения.

catch (RulesException re)
{
    re.AddModelStateErrors(ModelState, "");

    return View(foo);
}

Говоря все это, иногда я получаю подлое подозрение, что мы можем делать это немного неправильно.

3 голосов
/ 31 июля 2010

Что ж, отчасти причина для PRG состоит в том, чтобы избежать "Вы хотите повторно отправить форму?"Диалог.AJAX обычно не имеет этой проблемы, так как вы не действительно выполняете 'POST' (вы , но вы поймете мой дрейф).

В любом случаеRails поддерживает то, что вы хотели бы сделать, и я не думаю, что было бы так грубо переводить его в ASP.NET MVC.

Во-первых, вы можете указать клиентской части JavaScript JavaScript отправлять AJAX как text/javascript.Используя jQuery:

jQuery.ajaxSetup({
    'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript"); }
});

Поместите это где-нибудь перед запуском AJAX.Это повлияет на все другие вызовы AJAX, но не должно делать ничего непреднамеренного, если вы не ищете его на бэкэнде.

Затем в вашем контроллере найдите заголовок text/javascript и ответьте соответственно.Проверьте ТАК вопрос , который ссылается на эту статью .Хотел бы я дать больше информации, но у меня нет VS, чтобы попробовать это прямо сейчас.

...