Я использую частичное представление для входа в систему и хотел бы перенаправить пользователя на новую страницу в случае успеха и показать ошибки проверки в частичном представлении, если модель недействительна. Цель AJAX обновляется и успешно или неудачно. Если модель действительна, она показывает всю новую страницу в цели обновления, но я хочу, чтобы она перенаправляла на новую страницу. Я пробовал Redirect и RedirecttoAction, но это не дает желаемых результатов. Любые идеи о том, что я могу сделать, включают обновление ajax для перенаправления на новую страницу, а не обновление цели. Кроме того, дайте мне знать, если я использую неправильный подход.
Код частичного просмотра:
<% using (Ajax.BeginForm(
"LogOn",
null,
new AjaxOptions {
HttpMethod = "POST",
UpdateTargetId = "SignInForm"
},
new {
id = "SignInForm", ReturnUrl = Request.QueryString["ReturnUrl"]
})) { %>
<<Page HTML Controls>>
<input type="submit" value="Log On" />
<% } %>
Вот соответствующий код контроллера:
public ActionResult Logon(LogOnModel model,string returnUrl)
{
if (ModelState.IsValid)
{
//Login Logic Code
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "App");
}
}
// If we got this far, something failed, redisplay form
if (Request.IsAjaxRequest())
return PartialView("LogOnControl");
return View(model);
}
Для выполнения перенаправления вам нужно сделать это на стороне клиента. Таким образом, вы больше не можете использовать UpdateTargetId
, а должны использовать опцию OnSuccess
. Вам также нужно изменить действие контроллера Logon
так, чтобы в случае редиректа вы проверили, является ли это ajax-запросом и в этом случае вернули Json-объект с url редиректа, который будет использоваться в javascript:
if (ModelState.IsValid)
{
if (string.IsNullOrEmpty(returnUrl))
{
returnUrl = Url.Action("Index", "App");
}
if (Request.IsAjaxRequest())
{
return Json(new { returnUrl = returnUrl });
}
return Redirect(returnUrl);
}
И в виде:
<% using (Ajax.BeginForm(
"LogOn",
null,
new AjaxOptions {
HttpMethod = "POST",
OnSuccess = "success"
},
new {
id = "SignInForm", ReturnUrl = Request.QueryString["ReturnUrl"]
})) { %>
<<Page HTML Controls>>
<input type="submit" value="Log On" />
<% } %>
<script type="text/javascript">
function success(context) {
var returnUrl = context.get_data().returnUrl;
if (returnUrl) {
window.location.href = returnUrl;
} else {
// TODO: update the target form element with the returned partial html
}
}
</script>