我正在使用@Html.CheckBoxFor(x => x.Luxury)
生成以下HTML
<input id="Luxury" type="checkbox" value="true" name="Luxury" data-val-required="The Luxury field is required." data-val="true">
<input type="hidden" value="true" name="Luxury">
所以无论我设置什么,控制器操作的复选框都将值设置为TRUE,即使未选中也是如此。
如何让MVC不使复选框返回true。 当我在调用任何代码之前调试第一个Brace时,我可以看到Banner.Luxury总是= true
我的班级
public class Banner
{
public int Id { get; set; }
public bool Luxury { get; set; }
}
[HttpPost]
public ActionResult Save(Banner banner)
....
}
当我运行
时,查看此问题Why does ASP.NET MVC Html.CheckBox output two INPUTs with the same name?无效Convert.ToBoolean(Request.Form.GetValues("Luxury"));
只有“真实”不是“真实;虚假”;
这种解决方法有效,但它是一个糟糕的HACK
@{ if (Model.Luxury)
{
<input type="checkbox" name="Luxury" value="1" checked="checked" />
}
else
{
<input type="checkbox" name="Luxury" value="1" />
}
}
码
banner.Luxury = !(Request.Form.GetValues("Luxury") == null);
答案 0 :(得分:0)
将其更改为:
<input type="hidden" value="false" name="Luxury">
<input id="Luxury" type="checkbox" value="true" name="Luxury" data-val-required="The Luxury field is required." data-val="true">
当你取消选中复选框时,它将变为真,否则将为假。控制的顺序很重要。
在您的示例中,即使您更改了订单,也始终返回true。
答案 1 :(得分:0)
评论中没有足够的空间。您说CheckBoxFor
输出此代码:
<input type="hidden" value="true" name="Luxury">
我很难看到它会如何做到这一点,考虑到生成该辅助字段的代码是这样的(InputHelper
由CheckBoxHelper
调用CheckBoxFor
调用{:1}}:< / p>
if (inputType == InputType.CheckBox) {
StringBuilder inputItemBuilder = new StringBuilder();
inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));
TagBuilder hiddenInput = new TagBuilder("input");
hiddenInput.MergeAttribute("type",
HtmlHelper.GetInputTypeString(InputType.Hidden));
hiddenInput.MergeAttribute("name", fullName);
hiddenInput.MergeAttribute("value", "false"); // <-- Notice this
inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing));
return MvcHtmlString.Create(inputItemBuilder.ToString());
}
请注意,它明确地将value
设置为“false” - 它没有从任何地方获取隐藏字段的值。所以,除非你有自己的CheckBoxFor
方法 - 或其他一些恶作剧 - 我不知道它最终会如何“真实”。
但是,是的,只要“隐藏”输入 “是”,Luxury
最终将永远为真。
选中该复选框后,将发送复选框的值 - 以及MVC将忽略的隐藏值 - (Luxury=true&Luxury=true
- 或POST等效项)。
取消选中时,仅发送隐藏值(Luxury=true
)。
这就是隐藏输入应为false
的原因 - 以便在取消选中复选框时发送Luxury=false
。同样,问题是,为什么不是它false
?
对此的解释位于您的代码中我们尚未见过的地方。