我正在尝试在MVC应用程序的登录页面上添加经典的“接受条款和条件”复选框。
如果用户接受条款和条件,但由于某些其他原因(密码错误等)无法登录,那么我希望不检查Accept T& Cs复选框,因此用户被迫接受T& ;每次登录时都有Cs。
问题是使用Html.CheckboxFor(),在回发后,复选框保留其先前的值,尽管绑定的Model属性的值。
这是代码,精简到必需品。如果您运行此代码,请选中复选框,然后单击按钮,即使绑定的模型属性为false,您也将返回到仍然选中复选框的表单。
模特:
namespace Namespace.Web.ViewModels.Account
{
public class LogOnInputViewModel
{
[IsTrue("You must agree to the Terms and Conditions.")]
public bool AcceptTermsAndConditions { get; set; }
}
}
验证属性:
public class IsTrueAttribute : ValidationAttribute
{
public IsTrueAttribute(string errorMessage) : base(errorMessage)
{
}
public override bool IsValid(object value)
{
if (value == null) return false;
if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
return (bool)value;
}
}
观点:
@model Namespace.Web.ViewModels.Account.LogOnInputViewModel
@using (Html.BeginForm()) {
@Html.CheckBoxFor(x => x.AcceptTermsAndConditions)
<input type="submit" value="Log On" />
}
控制器:
[HttpGet]
public ActionResult LogOn(string returnUrl)
{
return View(new LogOnInputViewModel { AcceptTermsAndConditions = false });
}
[HttpPost]
public ActionResult LogOn(LogOnInputViewModel input)
{
return View(new LogOnInputViewModel { AcceptTermsAndConditions = false });
}
我看到了on asp.net的建议,要在CheckboxFor中添加@ checked
属性。我尝试了这个,制作视图
@model Namespace.Web.ViewModels.Account.LogOnInputViewModel
@using (Html.BeginForm()) {
@Html.CheckBoxFor(x => x.AcceptTermsAndConditions, new { @checked = Model.AcceptTermsAndConditions })
<input type="submit" value="Log On" />
}
我看到了同样的行为。
感谢您提供任何帮助/见解!
编辑:虽然我想覆盖发布的返回值,但是如果AcceptTermsAndConditions的验证失败(在AcceptTermsAndConditions上有验证属性要求它为true),我希望保留该消息,所以我不能使用ModelState.Remove("AcceptTermsAndConditions")
这是@counsellorben给我的其他正确答案。我编辑了上面的代码以包含验证属性 - 向@counsellorben致歉,因为它原来不是更清晰。
答案 0 :(得分:3)
您需要清除AcceptTermsAndConditions
的ModelState。根据设计,CheckBoxFor
和其他数据绑定助手首先绑定到ModelState,然后绑定到模型,如果该元素没有ModelState。将以下内容添加到POST操作中:
ModelState.Remove("AcceptTermsAndConditions");