Esto es lo que podría hacer:
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
// everything went fine and we want to redirect in this case =>
// we pass the url we want to redirect to as a JSON object:
return Json(new { redirectTo = Url.Action("SomeController", "SomeAction") });
}
else
{
// there was an error => add an error message
ModelState.AddModelError("login is fail")
}
// return a partial view instead of a full vire
return PartialView("Login",model)
}
y entonces todo lo que necesita es la función de Éxito:
@using (Ajax.BeginForm("Login", new AjaxOptions { HttpMethod = "POST", OnSuccess = "loginAjaxSuccess" }))
{
}
en la que se podía probar en cuyo caso son:
function loginAjaxSuccess(result) {
if (result.redirectTo) {
// the controller action returned a JSON result => it was a successful login
// => we redirect the browser to this url
window.location.href = result.redirectTo;
} else {
// the action returned a partial view with the form containing the errors
// => we need to update the DOM:
$('#Login').html(result);
}
}
Por cierto, si está utilizando una validación discreta del lado del cliente en el caso de error donde está refrescando el formar tendrá que forzar manualmente el análisis de las nuevas reglas de validación, de lo contrario la próxima vez que intente enviar el formulario, la validación del cliente no funcionará:
} else {
// the action returned a partial view with the form containing the errors
// => we need to update the DOM
$('#Login').html(result);
// Now that the DOM is updated let's refresh the unobtrusive validation rules on the form:
$('form').removeData('validator');
$('form').removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse('form');
}
¿Qué haces en la función de éxito? ¿Redirige? Por lo que entiendo, quiere mostrar mensajes de error en caso de que la validación falle => desea devolver una vista parcial que contenga el formulario de inicio de sesión y luego actualizar la parte correspondiente de su DOM. ¿Pero qué pasa con el caso de éxito? ¿Qué quiere devolverle al cliente en este caso? ¿Una vista? –
Gracias Darin por reproducirme sí, quiero redireccionar en éxito, pero en caso de error solo quiero llamar a OnFailure con mensaje de error. actualmente en la aplicación que llama al método de éxito incluso ModelState no es válido – Shivkumar