为什么复选框始终为真

时间:2012-02-11 14:23:01

标签: asp.net-mvc

我正在使用@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);

2 个答案:

答案 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">

我很难看到它会如何做到这一点,考虑到生成该辅助字段的代码是这样的(InputHelperCheckBoxHelper调用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

对此的解释位于您的代码中我们尚未见过的地方。