ASP.NET MVC 3 CheckboxFor保留以前的值,尽管Model值

时间:2011-10-11 00:26:46

标签: asp.net-mvc-3 razor postback html-helper

我正在尝试在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致歉,因为它原来不是更清晰。

1 个答案:

答案 0 :(得分:3)

您需要清除AcceptTermsAndConditions的ModelState。根据设计,CheckBoxFor和其他数据绑定助手首先绑定到ModelState,然后绑定到模型,如果该元素没有ModelState。将以下内容添加到POST操作中:

ModelState.Remove("AcceptTermsAndConditions");