Я использую post-redirect-get шаблон для всех своих форм, но теперь должен добавить функциональность Ajax для улучшения пользовательского опыта. Мои начальные мысли - то, что эти два не смешиваются.
В сценарии PRG у меня было бы свое действие сообщения, которое затем или перенаправит назад к моему получать действие, если будет ошибка проверки, или перенаправление к моему успеху получает действие иначе.
В сценарии Ajax я должен возвратить частичное представление так или иначе. Более обычно я проверил бы, чтобы видеть, является ли это запрос Ajax сначала. Если так, возвратите частичное представление, еще возвратите представление.
Какие-либо мысли или предложения?
Мы используем 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);
}
Однако, говоря все это, иногда у меня возникает подозрение, что мы делаем это немного неправильно.
Что ж, отчасти причина использования 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 под рукой, чтобы опробовать его прямо сейчас.