2012-12-20 43 views
2

我在VB.Net中使用ASP.Net MVC 4,我已經看到了一些關於如何在c#中爲可空布爾值創建複選框的其他答案。通常轉換爲VB.Net非常簡單。這我想不通。CheckBoxFor VB.Net中的可空布爾值

其他的答案說,要做到這一點..

做出Boolean.cshtml在我EditorTemplates文件夾,並堅持

@model bool?  
@Html.CheckBox("", Model.GetValueOrDefault()) 

所以,我嘗試了VB equivelent,在EditorTemplates我的文件夾作出Boolean.vbhtml並把這

@model System.Nullable(of Boolean) 
@Html.CheckBox("", Model.GetValueOrDefault) 

然後在我看來我有

@Html.EditorFor(Function(x) x.myNullableBool) 

即代碼拋出該異常:

對象變量或帶塊變量未設置。

我發現了幾個不同的地方,它們與我們發佈的非常相似的c#示例非常相似。有誰知道如何讓這個工作在VB.Net?

編輯

這是什麼樣的,我試圖做(如果它的工作它會是更好)

@model System.Nullable(of Boolean) 
@Html.CheckBox("", If(Model is Nothing, False, Model)) 
+0

在您的ViewModel中使用Nullable(布爾值),但是使用複選框設置它的目的是什麼?仍然有三個可能的'價值'。改用兩個不同的ViewModel代替。如果你目前綁定你DomainModel我會建議使用ViewModels來代替。 – nik

+1

@milter - 我總是希望2個值中的一個值爲真或假,數據庫必須保持爲空,因爲數據可以來自其他來源,並且從這些來源可以爲空,在我的情況下,如果它恰好爲空 - 強制它爲假是好的 –

回答

3

一個HTML checkbox有2種狀態:

  • 檢查
  • 未檢查

翻譯成.NET boolean類型而言,這意味着:

所以試圖在您的視圖模型可空布爾屬性綁定到一個複選框,幾乎沒有什麼邏輯感。可空布爾在.NET中有3種狀態:

  • 沒有(在C#中爲null)

所以你可以看到HTML語義複選框的只是沒有按」適合你的視圖模型類型。爲什麼Html.CheckBoxFor幫助程序需要布爾屬性而不是nullable布爾值,這並不奇怪。

所以我建議你修改你的視圖模型屬性的類型是一個非空的布爾值,如果你想將它綁定到一個複選框。

否則你總是可以有以下內容的~/Views/Shared/EditorTemplates/Boolean.vbhtml自定義編輯器模板:

@ModelType Nullable(Of Boolean) 
@Html.CheckBox("", If(Model.HasValue, Model.Value, False)) 

但是,這些類型的黑客不應該是必要的,如果你正確地即設計視圖模式,以滿足您的意見要求。

+0

我可能會改變視圖模型,但我試過你的代碼,並找到類型'布爾'找不到'公共成員'HasValue'「。 –

+0

你的自定義編輯器模板的'ModelType'應該是'@ModelType Nullable(Of Boolean)'(如我的答案所示),而不是'@ModelType Boolean'。 –

+1

ahhh,我有「@model」,我需要「@ModelType」,感謝您的幫助,我可能會改變ViewModel。但我現在感覺好多了,我一直在閱讀關於自定義編輯器模板的知識,現在已經有了一個工作 –