У меня есть виджет входа в систему, который является частичным представлением, которое я хочу обновить с ошибками проверки модели при возникновении проблемы, в противном случае страница должна быть перезагружена.
У меня есть следующее
LogOn.cshtml
@{
var ajaxOpts = new AjaxOptions {OnSuccess = "success"};
}
<div id="login">
@Html.ValidationSummary(excludePropertyErrors: true)
<h2>Start by Logging in</h2>
@using (Ajax.BeginForm("LogOn", "Account", ajaxOpts))
{
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
<table width="100%" border="0" cellspacing="0" cellpadding="5">
<tr>
<td>
<span class="bluey">Username:</span><br />
@Html.TextBoxFor(m => m.UserName, new {tabindex = "1", Class = "field"})
@Html.ValidationMessageFor(m => m.UserName, "*")
</td>
<td>
<span class="bluey">Password:</span><br />
@Html.TextBoxFor(m => m.Password, new {tabindex = "2", Class = "field"})
@Html.ValidationMessageFor(m => m.Password, "*")
</td>
</tr>
<tr>
<td>
<input name="login" type="submit" value="Submit" class="input_btn" tabindex="3" />
</td>
<td>@Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe) <span class="bluey"> | </span> @Html.ActionLink("Forgot Password?", "Password", "User")</td>
</tr>
</table>
}
</div>
<script>
function success(context) {
//var returnUrl = context.get_data().returnUrl;
//if (returnUrl) {
// window.location.href = returnUrl;
//} else {
$("#login").replaceWith(context);
//}
}
</script>
и вызываемое действие
[HttpPost]
public ActionResult LogOn(LogOnModel userDetails, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(userDetails.UserName, userDetails.Password))
{
FormsAuthentication.SetAuthCookie(userDetails.UserName, userDetails.RememberMe);
return Redirect(returnUrl);
}
ModelState.AddModelError("", "The username or password provided was incorrect");
}
return PartialView(userDetails);
}
У меня это работает так, что при неправильных данных частичное представление снова отображается с ошибкамиоднако эта часть работает только в том случае, если я закомментировал другие строки javascript в успехе (контекст), которые существуют, когда пользователь успешно входит в систему и страница должна быть перенаправлена.
Есть ли лучший способ сделать это?
Я попытался вернуть анонимные объекты с помощью Json (), у которых было свойство status, и returnUrl или Html, однако я не мог понять, как получить HTML, который был бы сгенерирован PartialView (userDetails) ввызов Json (), и кажется, что в любом случае это может быть неправильным путем.