VB.Net中可为空布尔值的复选框

VB.Net中可为空布尔值的复选框,vb.net,razor,asp.net-mvc-4,Vb.net,Razor,Asp.net Mvc 4,我在VB.Net中使用ASP.NETMVC4,我看到了一些关于如何在c#中为可空布尔值设置复选框的其他答案。通常转换到VB.Net非常简单。这我搞不懂 其他答案是这样的 在我的EditorTemplates文件夹中创建Boolean.cshtml并粘贴 因此,我尝试了VB等价物,在EditorTemplates文件夹中,我制作了Boolean.vbhtml并将其放入 @model System.Nullable(of Boolean) @Html.CheckBox("", Model.GetVa

我在VB.Net中使用ASP.NETMVC4,我看到了一些关于如何在c#中为可空布尔值设置复选框的其他答案。通常转换到VB.Net非常简单。这我搞不懂

其他答案是这样的

在我的EditorTemplates文件夹中创建Boolean.cshtml并粘贴

因此,我尝试了VB等价物,在EditorTemplates文件夹中,我制作了Boolean.vbhtml并将其放入

@model System.Nullable(of Boolean)
@Html.CheckBox("", Model.GetValueOrDefault)
那么在我看来我有

@Html.EditorFor(Function(x) x.myNullableBool)
该代码引发此异常:

未设置对象变量或带块变量

我发现有几个不同的地方有非常相似的c#示例,非常类似于这里发布的内容。有人知道如何在VB.Net中使用它吗

编辑

这正是我想做的(如果成功的话会更好)

A有两种状态:

  • 检查
  • 未经检查
转换为.NET类型术语意味着:

  • 真的
  • 假的
因此,尝试将视图模型上的可空布尔属性绑定到复选框几乎没有任何逻辑意义。可为空的布尔值在.NET中有3种状态:

  • Nothing(C#中为空)
  • 真的
  • 假的
因此,正如您所看到的,复选框的HTML语义根本不适合您的视图模型类型。顺便说一句,为什么Html.checkboxforhelper需要一个布尔属性,而不是可为null的布尔属性,这并不奇怪

因此,如果要将视图模型属性绑定到复选框,我建议您将其类型修改为不可为空的布尔值

否则,您可以始终使用具有以下内容的
~/Views/Shared/EditorTemplates/Boolean.vbhtml
自定义编辑器模板:

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

但是,如果您正确地设计视图模型,即与视图的要求相匹配,则不必进行此类攻击。

在视图模型中设置为Nullable(布尔值)但使用复选框进行设置的目的是什么?仍然有三种可能的“价值观”。最好使用两种不同的ViewModel。如果您当前绑定的是DomainModel,我建议您改用ViewModels。@milter-我总是想要两个值中的一个为true或false,db必须保持为null,因为数据可以来自其他来源,而来自这些来源的数据可以为null,在我的例子中,如果它恰好为null-强制它为false是可以的,我可能会更改视图模型,但我尝试了您的代码,并得到了“未找到类型“Boolean”的公共成员“HasValue”。自定义编辑器模板的
ModelType
应该是
@ModelType Nullable(属于布尔)
(如我的回答所示),不是
@ModelType Boolean
。啊,我有了“@model”,我需要“@ModelType”,谢谢你的帮助,我可能会更改ViewModel。但我现在感觉好多了,我一直在读关于自定义编辑器模板的书,现在有一个可以使用了
@model System.Nullable(of Boolean)
@Html.CheckBox("", If(Model is Nothing, False, Model))
@ModelType Nullable(Of Boolean)
@Html.CheckBox("", If(Model.HasValue, Model.Value, False))