2012-02-11 38 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