2011-12-13 45 views
7

我是從WebForms到MVC的新手。我使用類型bool?查看模型字段,默認情況下,EditorFor()將此字段呈現爲具有「未設置」選項的DropDownList。我寧願將它作爲一個複選框來呈現,如果該值爲null,只需將其設置爲未選中。將Nullable Bool渲染爲複選框

字段名稱爲RFP.DatesFlexible,所以我寫了在我看來,下面的標記:

<input type="checkbox" id="RFP_DatesFlexible" name="RFP.DatesFlexible" /> 
<label for="RFP_DatesFlexible">My Dates are Flexible</label> 

但是,這是行不通的。結果始終爲空,並且ModelState.IsValid爲假。

任何人都可以說我可以做這個工作嗎?

編輯

這是我最後的代碼,這似乎很好地工作。

@Html.CheckBox("RFP.DatesFlexible", Model.RFP.DatesFlexible ?? false) 
@Html.Label("RFP.DatesFlexible", "My Dates are Flexible") 

該標籤與複選框正確關聯,因此單擊該文本將切換複選框。

+0

謝謝你的回答! – resnyanskiy

回答

5

像這樣的東西?

型號:

public class MyViewModel 
{ 
    public ViewModel2 RDP { get; set; } 
} 

public class ViewModel2 
{ 
    public bool? DatesFlexible { get; set; } 
} 

控制器:

public ActionResult TestBool() 
    { 
     return View(new MyViewModel { RDP = new ViewModel2() }); 
    } 

    [HttpPost] 
    public ActionResult TestBool(MyViewModel vm) 
    { 
     return View(); 
    } 

查看:

@model mvc_testing_2.Models.MyViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.CheckBox("RDP.DatesFlexible", 
     Model.RDP.DatesFlexible != null && (bool)Model.RDP.DatesFlexible) 

    <input type="submit" value="go" /> 
} 
+0

這不起作用。第一個參數是一個錯誤,因爲它不能轉換布爾?布爾。如果我將它轉換爲布爾型,那麼我得到一個錯誤,因爲它不是一個屬性。 –

+0

好吧,然後將其更改爲:'@ Html.CheckBox(「DatesFlexible」,Model.DatesFlexible!= null &&(bool)Model.DatesFlexible)''。這工作,我只是測試它。 (RFP是另一個模型的屬性嗎?Model.RFP.DatesFlexible?如果是這樣,你可能需要命名輸入如何在你的問題中有它,我不記得手邊) – hawkke

+0

編譯 - 謝謝。但是,當提交頁面時,該字段仍爲「空」。不知何故,這並不意味着控制與現場相關。 (該字段是Model.RFP.DatesFlexible。) –

1

首先,我認爲這將有助於瞭解如何Html.CheckBox作品。這不是你所期望的。看看HTML.CheckBox Behaviour

要回答你的問題,你的代碼不起作用的原因是因爲你的<input />需要value='true'正確綁定。例如:

<input type='checkbox' name='RFP.DatesFlexible' value='true' /> 

,並添加checked='checked'財產是否應該進行檢查。

這就是爲什麼我通常會用我自己的方法覆蓋Html.CheckBox方法。默認的實現只是令人困惑。

+0

是的,這是令人困惑的。我編輯了我的問題以顯示我最終使用的實際代碼。我仍然可以使用'@ Html'語法,因爲它提供了一些好處。而且,當然,如果我檢查標記,它確實包含'value ='true''屬性。 –

+0

@JonathanWood你上面的實際代碼看起來很完美,這正是我所要做的。 –

0

我知道它被標記爲接受,但我有類似的問題,但我迭代子項目,所以我有名稱參數布爾問題?ISOPEN

當我用這個是沒有綁定到視圖模型上的文章,但呈現下拉:

@Html.EditorFor(model => model.Days[i].isOpen) 

此呈現的複選框,但值,其中空在後:

@Html.EditorFor("isOpen", model.Days[i].isOpen ?? false) 

通過查看在呈現的HTML我做了這在解決它的看法:

@Html.CheckBox("Days[" + i +"].isOpen", Model.Days[i].isOpen ?? false) 

我知道這是知道這是有點快ñ骯髒,但它的工作

希望這可以幫助別人的某個地方。