2012-02-11 39 views
3

我使用@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。 当我调试的第一支撑我之前也呼吁任何代码,我可以看到Banner.Luxury总是=真

我的班级

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

这很可能是问题在于你的行为,所以你想要发布代码。 HTML中的复选框可能无法按照您的操作假定它执行的方式工作(即,如果您手动将其值绑定到模型,那么您可能会做错)。 – JimmiTh 2012-02-11 14:31:03

+0

@TheKaneda我给我的问题添加了更多的代码,但是我没有在代码中做任何事情。我在其他许多页面上使用这个类似的代码,它工作正常。 – Daveo 2012-02-11 14:40:02

+0

不,因为如果你的隐藏值是错误的,即使你勾选了复选框,你仍然会从'Luxury'中得到错误,因为带有名字的LAST字段优先。 – twilson 2012-02-11 14:40:39

回答

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。

+2

HTML生成 - 正确 - 所以它不应该(也不能)被改变。 – JimmiTh 2012-02-11 14:29:43

+0

我可以手动更改HTML,但由于其余代码使用razor @ Html.CheckBoxFor语法生成HTML,所以这会非常难看。如何在ASP/Razor中做到这一点 – Daveo 2012-02-11 14:29:43

+0

自动生成与否,如果您隐藏的输入框出现在相关的复选框后,将始终使用隐藏的输入值。我的方式,只有当复选框不勾选时才会使用它。它应该是。 http://iamcam.wordpress.com/2008/01/15/unchecked-checkbox-values/ \ – twilson 2012-02-11 14:42:16

0

评论中没有足够的空间。你说CheckBoxFor输出验证码:

<input type="hidden" value="true" name="Luxury"> 

我有一个非常很难看到它是如何做到这一点,考虑到代码生成助手场是这样(在InputHelperCheckBoxHelper称为所谓的CheckBoxFor):

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为“假” - 这不是从任何地方获得的隐藏字段的值。所以,除非你有自己的方法 - 或者其他一些恶作剧 - 我不明白它最终会变成“真实的”。

但是,是的,只要是“隐藏”输入“真”,Luxury最终会被总是如此。

当复选框被选中时,复选框的值 - 以及MVC将忽略的隐藏值被发送(Luxury=true&Luxury=true - 或POST等效值)。

未选中时,只发送隐藏值(Luxury=true)。

这就是为什么隐藏的输入应该是false--这样当取消选中复选框时发送Luxury=false。再一次,问题是,为什么不是false

对此的解释位于您的代码中,我们还没有看到。

+0

我既不。我只是检查了我的所有代码,看看它是否覆盖了任何扩展,而我不知道。我可以通过 – Daveo 2012-02-11 15:15:13

+0

更新我的问题来解决这个问题。无论如何,如果你没有助手,@ twilson的解决方法也可以工作(只需交换'的MVC) - 它也避免了需要在你的手动检查请求行动,因为一切都是模型粘合剂预期的。 – JimmiTh 2012-02-11 15:23:02

+0

想知道1/2年后发生downvote的原因,真是太神奇了... – JimmiTh 2013-07-12 17:11:09