Renvoyer l'objet Json de l'action du contrôleur vers jQuery
Je suis d'essayer de le faire fonctionner correctement (2 jours maintenant). Je suis en train de travailler sur un journal où je vais appeler le contrôleur de l'action à partir de jQuery, en lui passant en paramètre un objet JSON (en utilisant json2.js et le retour dans un objet Json à partir du contrôleur. Je suis en mesure d'appeler à l'action de l'amende, mais au lieu d'être en mesure de mettre la réponse où je veux juste une nouvelle fenêtre s'ouvre avec cet imprimé sur l'écran:
{"Message":"Invalid username/password combination"}
Et l'URL ressemble à http://localhost:13719/Account/LogOn donc, au lieu d'appeler à l'action et de ne pas avoir à recharger la page, c'est la prise de l'utilisateur du contrôleur, ce qui n'est pas bon.
Donc maintenant un peu de code, tout d'abord le code du contrôleur
[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");
}
Et le jQuery, le code
$("#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 };
}
Dans le cas où vous avez besoin de voir le réel formulaire de connexion qui est ainsi
<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>
Le formulaire de connexion est chargé sur la page principale avec
<% Html.RenderPartial("LogonControl");%>
Pas sûr que cela n'a aucune incidence sur le présent ou non, mais pensé que je le mentionne.
EDIT: Le formulaire de connexion est chargé similaire à la connexion de Twitter, cliquez sur un lien et la forme des charges avec l'aide de jQuery & CSS
source d'informationauteur PsychoCoder
Vous devez vous connecter pour publier un commentaire.
Action votre signature apparaîtra comme suit:
Si vous êtes en utilisant MVC 2, vous devez vous retourner quelque chose comme ceci :
Je l'ai trouvé ici
Pour un usage différent, voici mon code.
JQuery :
Et C#
Ok venu avec une résolution que je pensais que je voudrais partager ici au cas où quelqu'un arrive avec une question) des nouvelles. Au lieu d'utiliser $.ajax je suis passé à l'aide de $.post et changé mon code jQuery pour ressembler à cela et tout fonctionne juste la façon dont je l'ai d'abord attendu à:
Merci à tous qui ont regardé à ma question, et à @kerrubin que j'étais pas au courant de ce problème.
Penser à ce que @user350374 dit à propos de faire de la signature de mon action JsonResult au lieu de ActionResult j'ai fait un peu de bricolage et modifié ma solution originale pour utiliser JsonResult et a fait toutes les cochant/redirection en jQuery plutôt que dans l'action.
Mon action a changé de
Et mon jQuery appel à
LoginResult est une simple classe juste pour maintenir les pièces
Merci pour l'astuce @user35037, maintenant j'ai 2 façons d'aborder ce problème à l'avenir.