Contexto: Asp.Net MVC3 w/Razor¿Por qué Ajax.BeginForm reemplaza toda mi página?
Estoy tratando de poner un formulario de acceso en un diseño de la maquinilla de afeitar (antes dominar la página) para que, cuando los tiempos de usuario cabo, s/él puede pedir que ingrese sin siendo redirigido (como en RallyDev). Por lo tanto, he creado un _LogOn.cshtml parcial con todas las cosas necesarias (nombre de usuario, etc.) dentro de un Ajax.BeginForm con un UpdateTargetId que apunta a un div que contiene los controles de inicio de sesión dentro del formulario ajax. El formulario se devuelve a la acción AccountsController.RefreshLogOn, pero, obviamente, la página que contiene puede haberse procesado desde un controlador diferente. La acción RefreshLogOn devuelve PartialView ("_ LogOn"). En cualquier caso, mi expectativa/deseo es que solo se reemplacen los controles dentro de este div. Lo que sucede en cambio es que la ubicación de mi página cambia a/Accounts/RefreshLogon y la página completa se reemplaza por la parcial. ¿Hay algún otro enfoque que debería tomar?
Aquí está el código correspondiente:
_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 - generó> forma de etiqueta:
<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)
});">
Sí, sé que es un poco confuso: mi formulario ajax tiene el id = "refresh" y mi objetivo de actualización, dentro del formulario ajax, tiene id = "forma" - iba a cambiar eso de todos modos, por las dudas la palabra "forma" estaba confundiendo cualquier cosa. Pero espero que el consejo discreto de ajax sea la clave. Informaremos en breve, ¡gracias! – sydneyos
Lamentablemente, no hay alegría. Lo que estoy viendo es que la etiqueta de formulario generada por el ayudante de Ajax se dirige a las bibliotecas de MicrosoftAjax, no es javascript discreto. Estoy actualizando la publicación para mostrar la etiqueta de formulario generada. Los helpers que tengo están en System.Web.Mvc.dll v4.0.30319. ¿Debería tener algo más? – sydneyos
@sydneyos, si crees que el ayudante de Ajax está usando MicsoroftAjax, entonces necesitas incluir esas bibliotecas. Y déjame darte un consejo: deshazte de esta porquería y usa jquery. –