局部视图与ajax
我想通过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
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");