局部视图与ajax

局部视图与ajax,ajax,asp.net-mvc-3,Ajax,Asp.net Mvc 3,我想通过ajax更新局部视图,但它不起作用。看看这个模型类: public class LogOnModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "P

我想通过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>

即使用户名/密码正确且IsLoggedIn=true且返回URL=empty视图显示这些变量的空字段(但调试器在其中显示值)。为什么以及如何正确设置?

尝试从modelstate中清除操作中修改的值,或者如果在html帮助程序中使用这些值,则将使用旧值:

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

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

请注意,您上面的评论是“//如果我们到了这一步,出现了故障,请重新显示表单”,但是,在model.returnUrl之后,您没有什么可以停止处理的,因此,根据你上面的代码,评论是不正确的。它确实帮助了我,但我不明白为什么。对于两种情况,模型值都是相同的-对于模型状态清晰的情况和没有模型状态的情况。view为什么以及如何知道需要更新值?@John,这是因为TextBoxFor、HiddenFor等Html帮助程序。。。首先在绑定其值时查看modelstate,然后在模型中查看。这是故意的。因此,如果您打算修改已经发布的内容的值以及部分modelstate,那么如果希望后续视图中的html帮助程序使用修改后的值而不是作为POST请求一部分的原始值,则必须将其从该modelstate中删除。
ModelState.Remove("IsLoggedIn");
model.IsLoggedIn = true;
ModelState.Remove("ReturnUrl");
model.ReturnUrl = Url.Action("Index", "Home");