Действительно ли шаблон PRG является несовместимым с сообщениями формы Ajax?

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

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

В сценарии Ajax я должен возвратить частичное представление так или иначе. Более обычно я проверил бы, чтобы видеть, является ли это запрос Ajax сначала. Если так, возвратите частичное представление, еще возвратите представление.

Какие-либо мысли или предложения?

7
задан Pops 18 October 2010 в 13:40
поделиться

2 ответа

Мы используем 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);
}

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

4
ответ дан 7 December 2019 в 07:38
поделиться

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

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

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

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

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

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

3
ответ дан 7 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: