jQuery AJAX форма входа в систему с asp.net MVC - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть простая форма входа в мое приложение MVC (обратите внимание, что я не использую встроенную), которая выглядит примерно так:

@using (Html.BeginForm())
{
    <label for="UserName" class="placeholder">Email address or username</label>
    @Html.TextBoxFor(m => m.UserName)

    <label for="Password" class="placeholder">Password</label>
    @Html.PasswordFor(m => m.Password)

    <button type="submit" title="Log in">Log in &#9658;</button>
}

У меня есть несколько jquery, которые должны публиковать данные, используя ajax,Если пользователь прав, отправьте их на правильную страницу, в противном случае отобразится ошибка.Однако я борюсь.Может ли кто-нибудь указать мне правильное направление, так как в настоящее время я также получаю успех, даже если данные учетной записи неверны, и я потерял функциональность перенаправления при успешном входе в систему из-за предотвратимого отказа.*

[HttpGet]
public ActionResult Login()
{
    if (Session["UserID"] != null)
    {
        return RedirectToAction("Index", "Home", new { area = "Dashboard" });
    }

    return View();
}

[HttpPost]
public ActionResult Login(User user, string returnUrl)
{
    // Validate the email and password
    if (users.Login(user.UserName, user.Password, Request.UserHostAddress))
    {
        FormsAuthentication.SetAuthCookie(user.UserName, true);

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home", new { area = "Dashboard" });
        }
    }
    else
    {
        return View();
    }
}

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Ваше действие должно возвращать данные, а не HTML, потому что вы хотите использовать результат в обратном вызове JavaScript,

Например, вы можете вернуть объект json со свойством uservalidated, например:

[HttpPost]
public JsonResult Login(User user, string returnUrl)
{
    // Validate the email and password
    if (users.Login(user.UserName, user.Password, Request.UserHostAddress))
    {
        FormsAuthentication.SetAuthCookie(user.UserName, true);

        // build redirectUrl ...
        var redirUrl = ...
        return Json(new { uservalidated = true, url = redirUrl });
    }
    else
    {
        return Json (new { uservalidated = false, url = null });
    }
}

Ваш вызов ajax имеет два обратных вызова. Обратный вызов ошибки только в том случае, если вызов ajax происходит по какой-то причине неправильно.

Независимо от того, предоставил ли пользователь правильные учетные данные или нет, вы всегда вернетесь к своему успешному обратному вызову, потому что сам вызов ajax не должен завершиться ошибкой.

EDIT:

Хорошо, из комментариев я интерполирую, что вы хотите, чтобы ваш метод действия работал с включенным javascript и без него.

У вас есть две возможности:

  • Используйте два метода действия - один возвращает JsonResult, другой возвращает ActionResult
  • Используйте один метод действия, который автоматически определяет, является ли он запросом ajax или notand, и возвращает полный просмотр / перенаправление или данные JSON при вызове через ajax.

Это пример для последнего:

[HttpPost]
public ActionResult Login(User user, string returnUrl)
{
    // do login logic like shown above.
    bool userAuthenticated = ...
    string redirectUrl = ...

    if (Request.IsAjaxRequest()) {
        return Json(new { userAuthenticated = userAuthenticated, url = redirectUrl });
    }
    else {
        return Redirect(redirectUrl);
    }        
}

Последняя часть - как использовать возвращенные данные JSON в вашем коде JavaScript. Вы можете получить к нему доступ в обратном вызове, например:

$.ajax({
    ...
    success: function (data) {
                 if (data.userAuthenticated) {
                     window.location.href = data.url;
                 } else {
                     // show some fancy invalid credentials message...
                 }
             },
    ...
0 голосов
/ 08 ноября 2011

События успеха и неудачи вызова ajax относятся к состоянию самого вызова ajax. Если вызов завершен, но пользователь недействителен, то, что касается вызова ajax, это был успех.

В контроллере, который этот ajax публикует, вам необходимо вернуть флаг, в каком формате вы предпочитаете (text, xml, json), чтобы указать, был ли вход успешным.

После этого вы сможете получить доступ к этому значению в вашей функции успеха, так как оно передается как переменная responseHtml. Если этот флаг показывает, что логин был правильным, вы можете перенаправить, используя location.assign("page.aspx"), в правильное место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...