Логин пользователя в частичном представлении с отображением ошибок - PullRequest
6 голосов
/ 05 ноября 2011

Я хочу создать форму входа в систему, которая будет отображаться на боковой панели на каждой странице моего сайта.Если пользователь вводит неверного пользователя / пароль, я хочу, чтобы над этой формой отображались ошибки (оставшаяся часть страницы осталась прежней), и если он успешно вошел в систему, я хочу, чтобы форма изменилась на списокинформации о пользователе (опять же, остальная часть страницы такая же, как и до входа в систему).Я использую проект веб-приложения MVC 3 с шаблоном интернет-приложения по умолчанию.У меня есть это:

_Layout.cshtml

@{ 
    if (User.Identity.IsAuthenticated)
    {
        Html.RenderAction("ShowUserInfo", "User");
    }
    else
    {
        Html.RenderAction("LogIn", "User");   
    }        
}

UserController

    [ChildActionOnly]
    public PartialViewResult ShowUserInfo()
    {
        // populate loggedInInfo from database based on
        // User.Identity.Name
        return PartialView("_LoggedInInfo", loggedInInfo);
    }

    private ActionResult RedirectToPrevious(string returnUrl)
    {
        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("index", "");
        }
    }

    [ChildActionOnly]
    public PartialViewResult LogIn()
    {
        return PartialView("_LogInForm");
    }

    //
    // POST: /User/LogIn

    [HttpPost]
    public ActionResult LogIn(LogInModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                return RedirectToPrevious(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        return RedirectToPrevious(returnUrl);
    }

_LogInForm

@model MyProject.Models.LogInModel

<h2>Login</h2>
<p>
    Please enter your username and password. @Html.ActionLink("Register", "register", "user") if you don't have an account.<br />
    @Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")
</p>

@using (Html.BeginForm("LogIn", "user")) {
   html stuff
}

Это работает почти так, как задумано, за исключением того, что когда я ввожу неправильное имя пользователя / пароль, страница просто перезагружается с пустой формой, и ошибка не отображается.Я пробовал и другие вещи, но я либо получаю ошибки о том, что я не могу выполнить перенаправление с частичного представления, либо я получаю частичное представление (с отображением ошибок), отображаемое как целое представление, поэтому оно отображается как единое целоестраница, отдельно от остальной части сайта.Если я вхожу правильно, все работает нормально.

Как я могу получить правильное отображение ошибок над формой?Я бы предпочел не использовать Ajax или JQuery для этого.

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Похоже, проблема в том, что вы выполняете перенаправление, а не просто возвращаете соответствующее представление.

После добавления ошибки модели вам нужно вернуть представление вместо выполнения перенаправления:

return View("LoginViewNameGoesHere")

Таким образом, вы не хотите возвращать здесь частичное представление, но полное представление.

0 голосов
/ 05 ноября 2011

При выполнении RedirectToAction и Redirect текущий запрос заканчивается http кодом состояния для перенаправления - 3xx , что говорит браузеру сделать другой запрос на указанный URL. Это означает, что все данные проверки текущего запроса утеряны, и абсолютно новый, чистый запрос сделан для входа в систему URL. И вы получите пустую форму и без ошибок.

То, что вы должны сделать, это отобразить представление входа в систему в пределах текущей области запроса, а не путем перенаправления. Общий шаблон для повторного отображения недопустимого вида

public ActionResult Login(LogInModel model)
{
    if(ModelState.IsValid)
    {
       return RedirectToAction("Home");
    }
    return View(model); //! no redirection
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...