我刚刚注意到Html.CheckBox(“foo”)生成2个输入而不是一个,有人知道为什么是这样吗?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
我刚刚注意到Html.CheckBox(“foo”)生成2个输入而不是一个,有人知道为什么是这样吗?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
当前回答
从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
其他回答
你可以尝试像这样初始化Model的构造函数:
public MemberFormModel() {
foo = true;
}
在您看来:
@html.Checkbox(...)
@html.Hidden(...)
当复选框被选中并提交时,执行此操作
if ($('[name="foo"]:checked').length > 0)
$('[name="foo"]:hidden').val(true);
请参考
使用Contains,它将与两个可能的post值一起工作:"false"或"true,false"。
bool isChecked = Request.Form["foo"].Contains("true");
这是Alexander Trofimov解决方案的强类型版本:
using System.Web.Mvc;
using System.Web.Mvc.Html;
public static class HelperUI
{
public static MvcHtmlString CheckBoxSimpleFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlAttributes)
{
string checkBoxWithHidden = htmlHelper.CheckBoxFor(expression, htmlAttributes).ToHtmlString().Trim();
string pureCheckBox = checkBoxWithHidden.Substring(0, checkBoxWithHidden.IndexOf("<input", 1));
return new MvcHtmlString(pureCheckBox);
}
}
手动方法是这样的:
bool IsDefault = (Request.Form["IsDefault"] != "false");