Estoy intentando que esto funcione correctamente (hace 2 días). Estoy trabajando en un inicio de sesión donde estoy llamando a la acción del controlador desde jQuery, pasando un objeto JSON (utilizando json2.js) y devolviendo un objeto Json desde el controlador. Soy capaz de llamar a la multa de acción, pero en lugar de ser capaz de poner la respuesta donde quiero que sólo se abre una nueva ventana con esta impreso en la pantalla:Devolver el objeto Json de la acción del controlador a jQuery
{"Message":"Invalid username/password combination"}
Y la URL http parece : // localhost: 13719/Account/LogOn así que en lugar de llamar a la acción y no volver a cargar la página, lleva al usuario al controlador, lo cual no es bueno.
Así que ahora por algún código, primero el código del controlador
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl = "")
{
if (ModelState.IsValid)
{
var login = ObjectFactory.GetInstance<IRepository<PhotographerLogin>>();
var user = login.FindOne(x => x.Login == model.Username && x.Pwd == model.Password);
if (user == null)
return Json(new FailedLoginViewModel { Message = "Invalid username/password combination" });
else
{
if (!string.IsNullOrEmpty(returnUrl))
return Redirect(returnUrl);
else
return RedirectToAction("Index", "Home");
}
}
return RedirectToAction("Index", "Home");
}
Y el código jQuery
$("#signin_submit").click(function() {
var login = getLogin();
$.ajax({
type: "POST",
url: "../Account/LogOn",
data: JSON.stringify(login),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
error: function (xhr) {
$("#message").text(xhr.statusText);
},
success: function (result) {
}
});
});
function getLogin() {
var un = $("#username").val();
var pwd = $("#password").val();
var rememberMe = $("#rememberme").val();
return (un == "") ? null : { Username: un, Password: pwd, RememberMe: rememberMe };
}
En caso de tener que ver el formulario de acceso real aquí que es así
<fieldset id="signin_menu">
<div>
<span id="message"></span>
</div>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { @id = "signin" }))
{%>
<% ViewContext.FormContext.ValidationSummaryId = "valLogOnContainer"; %>
<%= Html.LabelFor(m => m.Username) %>
<%= Html.TextBoxFor(m => m.Username, new { @class = "inputbox", @tabindex = "4", @id = "username" })%><%= Html.ValidationMessageFor(m => m.Username, "*")%>
<p>
<%= Html.LabelFor(m=>m.Password) %>
<%= Html.PasswordFor(m => m.Password, new { @class = "inputbox", @tabindex = "5", @id = "password" })%><%= Html.ValidationMessageFor(m => m.Password, "*")%>
</p>
<p class="remember">
<input id="signin_submit" value="Sign in" tabindex="6" type="submit"/>
<%= Html.CheckBoxFor(m => m.RememberMe, new { @class = "inputbox", @tabindex = "7", @id = "rememberme" })%>
<%= Html.LabelFor(m => m.RememberMe) %>
<p class="forgot"> <a href="#" id="forgot_password_link" title="Click here to reset your password.">Forgot your password?</a> </p>
<p class="forgot-username"> <a href="#" id="forgot_username_link" title="Fogot your login name? We can help with that">Forgot your username?</a> </p>
</p>
<%= Html.ValidationSummaryJQuery("Please fix the following errors.", new Dictionary<string, object> { { "id", "valLogOnContainer" } })%>
<% } %>
</fieldset>
El formulario de inicio de sesión se carga en la página principal con
<% Html.RenderPartial("LogonControl");%>
No estoy seguro de si eso tiene alguna relación con esto o no, pero pensé que lo mencionaría.
EDIT: El formulario de acceso se carga similar a la de inicio de sesión de Twitter, haga clic en un enlace y se carga el formulario con la ayuda de jQuery & CSS
mi placer. y sí, gracias por publicar una solución detallada. – Baz1nga
@psycho Tuve el mismo problema aquí. Además del hecho de que la redirección como ActionResult no funcionaría cuando se llama a través de jQuery, la razón principal por la que tu primer código devolvió el "archivo json" es porque no has tenido el 'return false;' en la función de envío, por lo tanto, devolviendo el JSON como un "archivo". –