【问题标题】:Partial View and ajax局部视图和ajax
【发布时间】:2012-01-17 15:10:24
【问题描述】:

我想通过 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!=empty 视图也会显示这些变量的空字段(但调试器会显示其中的值)。为什么以及如何正确制作?

【问题讨论】:

  • 请注意您上面的评论说“//如果我们走到这一步,有些事情失败了,重新显示表单”但是,在 model.returnUrl 之后您没有什么可以停止处理,因此根据您的评论是不正确的上面的代码

标签: ajax asp.net-mvc-3


【解决方案1】:

尝试从模型状态中清除您在操作中修改的值,或者如果您在 html 帮助程序中使用它们,则将使用旧值:

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

还请记住,在成功进行身份验证和 cookie 发射后,您不应显示视图(在您的情况下是部分视图)。您应该重定向,以便客户端在后续请求中发送身份验证 cookie。您应该重定向到返回 url。但是由于您使用 AJAX 执行此操作,您可能应该向客户端发送一些指示,表明身份验证成功,以便您可以在客户端上重定向。

【讨论】:

  • 它确实帮助了我,但我不明白为什么。模型值是视图对于两种情况都是相同的 - 对于具有明确模型状态和没有模型状态的情况。视图为什么以及如何知道需要更新值?
  • @John,这是因为诸如 TextBoxFor、HiddenFor 等 Html 帮助程序在绑定它们的值时首先查看模型状态,然后在模型中查看。这是设计使然。因此,如果您打算修改已发布的内容的值和模型状态的一部分,如果您希望后续视图中的 html 帮助程序使用修改后的值而不是原来的值,则必须将其从此模型状态中删除。 POST 请求的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多