2012-12-20 42 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。但我现在感觉好多了,我一直在阅读关于自定义编辑器模板的知识,现在已经有了一个工作 –