Asp .net mvc 3 CheckBoxFor方法输出隐藏字段,当选中的复选框为true时,隐藏字段值为false

Sha*_*eet 10 asp.net-mvc checkboxfor

CheckBoxFor(t => t.boolValue,new {disabled ="disabled"})方法在禁用模式下呈现复选框.

该方法也呈现隐藏字段.

我的问题是为什么这个隐藏字段对于禁用复选框有错误值?我相信隐藏字段的目的是在默认的复选框行为上有一些额外的行为

有没有办法覆盖默认的MVC功能,以便即使在禁用模式下,此隐藏字段的值也基于复选框的状态?

Dar*_*rov 14

隐藏字段用于将复选框值绑定到布尔属性.问题是如果未选中复选框,则不会向服务器发送任何内容,因此ASP.NET MVC使用此隐藏字段发送false并绑定到相应的布尔字段.除了编写自定义帮助程序之外,您无法修改此行为.

这就是说,而不是使用复选框上的disabled="disabled"使用readonly="readonly".这样,您将保持用户无法修改其值所需的相同行为,但除此之外,在提交表单时,其值将发送到服务器:

@Html.CheckBoxFor(x => x.Something, new { @readonly = "readonly" })
Run Code Online (Sandbox Code Playgroud)

更新:

正如评论部分所述,该readonly属性不适用于Google Chrome.另一种可能性是使用另一个隐藏字段并禁用该复选框:

@Html.HiddenFor(x => x.Something)
@Html.CheckBoxFor(x => x.Something, new { disabled = "disabled" })
Run Code Online (Sandbox Code Playgroud)

更新2:

这是一个带有额外隐藏字段的完整测试用例.

模型:

public class MyViewModel
{
    public bool Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel { Foo = true });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return Content(model.Foo.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.HiddenFor(x => x.Foo)
    @Html.CheckBoxFor(x => x.Foo, new { disabled = "disabled" })
    <button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)

提交表单时,Foo属性的值为true.我已经测试过所有主流浏览器(Chrome,FF,IE).