我刚刚注意到Html.CheckBox(“foo”)生成2个输入而不是一个,有人知道为什么是这样吗?

<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" /> 

当前回答

当复选框被选中并提交时,执行此操作

if ($('[name="foo"]:checked').length > 0)
    $('[name="foo"]:hidden').val(true);

请参考

其他回答

你可以尝试像这样初始化Model的构造函数:

public MemberFormModel() {
    foo = true;
}

在您看来:

@html.Checkbox(...)
@html.Hidden(...)

如果未选中复选框,则不提交表单字段。这就是为什么隐藏字段中总是有假值的原因。如果你不选中复选框,表单仍然会有隐藏字段的值。这就是ASP。NET MVC处理复选框值。

如果您想确认这一点,请在表单上放置一个复选框,而不是Html。隐藏,但带有<input type="checkbox" name="MyTestCheckboxValue"></input>。不选中复选框,提交表单并查看服务器端发布的请求值。您将看到没有复选框值。如果你有隐藏字段,它将包含MyTestCheckboxValue项的假值。

从ASP开始。NET (Core) 5,添加到你的启动:

services.Configure<MvcViewOptions>(options =>
{
    // Disable hidden checkboxes
    options.HtmlHelperOptions.CheckBoxHiddenInputRenderMode = CheckBoxHiddenInputRenderMode.None;
});

以你的观点为例:

<input class="form-check-input" asp-for="@Model.YourBool" />

此属性的附加隐藏字段不再在表单中创建:

<input class="form-check-input" type="checkbox" data-val="true" data-val-required="The YourBool field is required." id="YourBool" name="YourBool" value="true" />

来源:https://github.com/dotnet/aspnetcore/pull/13014 # issuecomment - 674449674

在。net core 6中,我遇到了同样的问题,我尝试了@Kolazomai答案,它是有效的。

using Microsoft.AspNetCore.Mvc;

builder.Services.Configure<MvcViewOptions>(
opt=>opt.HtmlHelperOptions.CheckBoxHiddenInputRenderMode = Microsoft.AspNetCore.Mvc.Rendering.CheckBoxHiddenInputRenderMode.None
);

使用Contains,它将与两个可能的post值一起工作:"false"或"true,false"。

bool isChecked = Request.Form["foo"].Contains("true");