Próbuję uruchomić to poprawnie (2 dni). Pracuję nad logowaniem, w którym wywołuję działanie kontrolera z jQuery, przekazując mu obiekt JSON (wykorzystujący json2.js) i zwracając obiekt Json z kontrolera. Jestem w stanie wywołać grzywnę działania, ale zamiast być w stanie umieścić odpowiedź, gdzie chcę go po prostu otwiera nowe okno z tym drukowane na ekranie:Powracanie obiektu Json z akcji kontrolera do jQuery
{"Message":"Invalid username/password combination"}
A URL wygląda http : // localhost: 13719/Account/LogOn, więc zamiast wywoływać akcję i nie przeładowywać strony, przenosimy użytkownika do kontrolera, co nie jest dobre.
Więc teraz przez jakiś kod, najpierw kod kontrolera
[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");
}
a kod 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 };
}
w przypadku trzeba zobaczyć rzeczywisty formularz logowania tutaj, że jest tak dobrze
<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>
Formularz logowania jest ładowany na stronę główną za pomocą
<% Html.RenderPartial("LogonControl");%>
Nie jestem pewien, czy to ma jakikolwiek wpływ na to, czy nie, ale pomyślałem, że wspomnę o tym.
EDIT: Formularz logowania jest załadowany podobny do logowania Twitter, kliknij link i obciążeń tworzyć z pomocą jQuery & CSS
mojej przyjemności. i tak dzięki za ogłoszenie szczegółowe rozwiązanie .. – Baz1nga
@psycho Miałem ten sam problem tutaj. Poza tym, że przekierowanie jako ActionResult nie zadziała, gdy zostanie wywołane przez jQuery, głównym powodem, dla którego twój pierwszy kod zwrócił "plik json", jest to, że nie masz 'return false;' w funkcji submit, więc zwrócenie JSON jako "pliku". –