在绑定/呈现表达式中使用VB.NET If vs.IIf

在绑定/呈现表达式中使用VB.NET If vs.IIf,vb.net,Vb.net,我正在尝试以空安全的方式将UI控件绑定到ASP.NET页面上作为属性公开的业务对象 使用“If”运算符是空安全的,但会导致编译器错误: 编译器错误消息:BC30201:应为表达式 使用'IIf'成功,但不是空安全的。我尝试了两种呈现表达式语法(“”)和绑定表达式语法(“”),但没有区别 有人能解释这种不一致性并提供一种替代方案吗 示例代码: 这项工作: 这会引发编译器错误: 你必须做以下事情 <% if someCondition then %> some html here &l

我正在尝试以空安全的方式将UI控件绑定到ASP.NET页面上作为属性公开的业务对象

使用“If”运算符是空安全的,但会导致编译器错误:

编译器错误消息:BC30201:应为表达式

使用'IIf'成功,但不是空安全的。我尝试了两种呈现表达式语法(“”)和绑定表达式语法(“”),但没有区别

有人能解释这种不一致性并提供一种替代方案吗

示例代码:

这项工作:

这会引发编译器错误:

你必须做以下事情

<% if someCondition then %>
some html here
<% end if %>

这里有一些html

当使用
IIf
时,
后面没有等号,在调用IIf之前,对“true”和“false”表达式进行求值

这与调用此函数相同:

Public Function MyIIf(ByVal test As Boolean, ByVal trueOption As Object, ByVal falseOption As Object) As Object
    If test Then Return trueOption Else Return falseOption
End Function
因此,在调用
IIf
之前,
Me.Foo.Id
将被计算并抛出异常


这不是c#的工作方式。这可能是造成混淆的原因。

VB.NET现在包含一个短路IF()操作符。如果第一个运算符不为true,则永远不会计算第二个运算符。这与IIF的工作方式以及您可能编写的任何自定义函数的工作方式完全不同。实际上,它相当于C#:运算符

文档可在此处找到: 怎么样

<% if foo.me isnot nothing then response.write(me.foo.id) %>

您正在使用VB2008吗?该运算符在早期版本的VB中,这可能解释了编译器错误

在VB的早期版本中,我会使用


这里有一些html

好的,再次讨论这个问题,我认为我们可能用IF()找错了方向。答案可能在错误消息中:

编译器错误消息:BC30201: 需要一个表达式

因此,我构建了一个示例应用程序。标准Visual Studio 2008 Web应用程序。我创建了一个名为Bar的类,并将其添加到我的app_code文件夹中:

Imports Microsoft.VisualBasic

Public Class Bar
    Public Id As String
End Class
在default.aspx页面中,我将以下内容添加到代码隐藏文件中:

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Foo As New Bar()

End Class
请注意,
Foo
标记为
protected

在页面中,我添加了以下代码:

<form id="form1" runat="server">
<div>
    <%=If(Me.Foo Is Nothing, "", Me.Foo.Id)%>
</div>
</form>
如果这对您不起作用,那么我的建议是验证您的目标是.NET3.5框架。当我以.NET2.0为目标时,我在IF()调用中得到了“expressionexpected”。以3.5为目标时不会发生此错误


您可以通过Web应用程序属性上的Build选项卡验证您的目标是3.5。

我想Craig知道这一点(他说If()是空安全的)。我想他想知道为什么If()会出现编译器错误。这些都是对理解这种情况的有益贡献,但是Mike的答案是最好的。我的项目是在VS2008中构建的,但目标是.NET2.0。“If”运算符虽然在2.0中可用,但确实会导致编译错误,而目标3.5则不会。VB团队又一次令人困惑的不一致性,真是太好了!在这种情况下,绑定表达式的便利性对我来说很有吸引力,我找到了一种解决方法。注意到MarJ的评论,我用这个:再次感谢大家,感谢你们的时间和关注。
<form id="form1" runat="server">
<div>
    <%=If(Me.Foo Is Nothing, "", Me.Foo.Id)%>
</div>
</form>
Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Foo As New Bar()

    Public Sub New()
        Foo.Id = "Something"
    End Sub

End Class