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

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

当前回答

你可以写一个helper来防止添加隐藏输入:

using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HelperUI
{
    public static MvcHtmlString CheckBoxSimple(this HtmlHelper htmlHelper, string name, object htmlAttributes)
    {
        string checkBoxWithHidden = htmlHelper.CheckBox(name, htmlAttributes).ToHtmlString().Trim();
        string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
        return new MvcHtmlString(pureCheckBox);
    }
}

使用它:

@Html.CheckBoxSimple("foo", new {value = bar.Id})

其他回答

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

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

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

using Microsoft.AspNetCore.Mvc;

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

手动方法是这样的:

bool IsDefault = (Request.Form["IsDefault"] != "false");

在2020/11和。net 5预览版中,有一个拉请求应该使这种行为可控。谢谢大家!

不管怎样,如果有人觉得它有用,.NET Core 3.0的Alexander Trofimov的回答:

public static IHtmlContent CheckBoxSimple(this IHtmlHelper htmlHelper, string name)
{
    TextWriter writer = new StringWriter();

    IHtmlContent html = htmlHelper.CheckBox(name);
    html.WriteTo(writer, HtmlEncoder.Default);

    string checkBoxWithHidden = writer.ToString();

    string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
    return new HtmlString(pureCheckBox);
}

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

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

请参考