Контекст: Asp.Net MVC3 w/Razor
Я пытаюсь поместить форму входа в макет Razor (ранее мастер-страницу), так что, когда пользователь выйдет из системы, ему/ей может быть предложено войти в систему без перенаправления (как в RallyDev). Итак, я создал частичный _LogOn.cshtml со всеми необходимыми материалами (имя пользователя и т.д.) Внутри Ajax.BeginForm с UpdateTargetId, который указывает на div, который содержит элементы управления входами в форме ajax. Форма возвращается к действию AccountsController.RefreshLogOn, но, очевидно, содержащая страница может быть отображена с другого контроллера. Действие RefreshLogOn возвращает PartialView ( "_ LogOn" ). В любом случае, мое ожидание/желание состоит в том, что заменяются только элементы управления внутри этого div. Вместо этого происходит то, что мое местоположение страницы изменяется на /Accounts/RefreshLogon, а вся страница заменяется частичным. Есть ли другой подход, который я должен принять?
Вот соответствующий код:
_LogOn.cshtml
@{
using (Ajax.BeginForm("RefreshLogOn", "Accounts",
new AjaxOptions {
OnSuccess = "logonSucceeded",
OnFailure = "logonFailed",
HttpMethod = "Post",
UpdateTargetId = "user-info" },
new { @id = "refresh"}))
{
@Html.AntiForgeryToken()
<div id="user-info">
<p>Your session has expired.</p>
<div class="error">@Html.ValidationSummary()</div>
<table>
<tr>
<td>Username:</td>
<td>@Html.TextBoxFor(model => model.UserName)</td>
</tr>
<tr>
<td>Password:</td>
<td>@Html.PasswordFor(model => model.Password)</td>
</tr>
<tr>
<td>Remember Me:</td>
<td>@Html.CheckBoxFor(model => model.RememberMe)</td>
</tr>
</table>
</div>
}
}
AccountsController
public ActionResult RefreshLogOn (LogOnModel model)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
...content elided...
return PartialView("_LogOn");
}
ModelState.AddModelError("", ErrorMessages.IncorrectUsernameOrPassword);
}
return PartialView("_LogOn", model);
}
Ajax.BeginForm → сформированный тег формы:
<form action="/Accounts/RefreshLogOn" id="refresh" method="post"
onclick="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));"
onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event),
{
insertionMode: Sys.Mvc.InsertionMode.replace,
httpMethod: 'Post',
updateTargetId: 'user-info',
onFailure: Function.createDelegate(this, logonFailed),
onSuccess: Function.createDelegate(this, logonSucceeded)
});">