Частичный вид и Аякс - PullRequest
       2

Частичный вид и Аякс

0 голосов
/ 17 января 2012

Я хочу обновить Partial View через ajax, но он не работает.Посмотрите на этот класс модели:

   public class LogOnModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [Display(Name = "Remember me?")]
        public bool RememberMe { get; set; }

        public bool IsLoggedIn { get; set; }

        public string ReturnUrl { get; set; }
    }

следующий вид:

@model ITW2012Mobile.ViewModels.LogOnModel
<div id='LogOn' style="background-color: White;">
    @using (Ajax.BeginForm("LogOnAjax", "Home", new AjaxOptions { UpdateTargetId = "LogOn", OnSuccess = "logInComplete" }))
    { 
        ITW2012Mobile.ViewModels.LogOnModel m = Model;
        @Html.EditorFor(model => model.IsLoggedIn)
        @Html.EditorFor(model => model.ReturnUrl)
        <div>
            @Html.ValidationSummary()
        </div>
        <div>
            @Html.LabelFor(model => model.UserName)
            @Html.EditorFor(model => model.UserName)
        </div>
        <div>
            @Html.LabelFor(model => model.Password)
            @Html.EditorFor(model => model.Password)
        </div>
        <div>
            <input type="submit" value="Login" />
        </div>
    }
</div>

и следующий класс контроллера:

public ActionResult LogOnAjax(LogOnModel model)
{
    if (!User.Identity.IsAuthenticated)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                model.IsLoggedIn = true;
                model.ReturnUrl = Url.Action("Index", "Home"); 
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return PartialView("PartialViewAjaxLogOn", model);
    }
    else
    {
        return PartialView("PartialViewLogOut");
    }
}

, даже если имя пользователя / пароль верныIsLoggedIn = true и ReturnUrl! = пустое представление показывает пустые поля для этих переменных (но отладчик показывает значения внутри).Почему и как правильно это сделать?

1 Ответ

0 голосов
/ 17 января 2012

Попробуйте очистить значения, которые вы изменяете в своем действии, от состояния модели, или, если вы используете их в помощниках HTML, будут использованы старые значения:

ModelState.Remove("IsLoggedIn");
model.IsLoggedIn = true;
ModelState.Remove("ReturnUrl");
model.ReturnUrl = Url.Action("Index", "Home"); 

Также имейте в виду, что при успешной аутентификации и отправке файлов cookie вы не должны отображать представление (частичное в вашем случае). Вы должны перенаправить так, чтобы куки-файл аутентификации отправлялся клиентом при последующем запросе. Вы должны перенаправить на обратный URL. Но поскольку вы делаете это с помощью AJAX, вам, вероятно, следует отправить клиенту некоторое указание на то, что аутентификация прошла успешно, чтобы вы могли перенаправить его на клиент.

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