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

时间:2009-10-08 22:43:21

标签: vb.net

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

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

编译器错误消息:BC30201:预期的表达式。

使用'IIf'成功,但不是空的安全。我已经尝试了渲染表达式语法('<%=%>')绑定表达式语法('<%#%>'),但没有区别。

有人可以解释这种不一致,也许可以提供替代方案吗?

示例代码:

这有效: <%= IIf(Me.Foo Is Nothing,“”,Me.Foo.Id)%>

这会抛出编译器错误: <%= If(Me.Foo Is Nothing,“”,Me.Foo.Id)%>

6 个答案:

答案 0 :(得分:4)

好的,重新审视这个问题,我想我们可能会用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>

这适合我,我没有任何错误。如果我然后按如下方式修改代码隐藏,我得到预期的输出(“Something”出现在空白页面上):

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Foo As New Bar()

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

End Class

如果这对您不起作用,那么我的建议是验证您的目标是.NET 3.5 Framework。当我定位.NET 2.0时,我得到“预期的表达式”在IF()调用。定位3.5时不会发生此错误。

您可以通过Web应用程序属性的“构建”选项卡验证您的目标是否为3.5。

答案 1 :(得分:3)

您使用的是VB2008吗?早期版本的VB中If()运算符为not available,这可能解释了编译器错误。

在早期版本的VB中,我会使用Jason's answer

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

答案 2 :(得分:1)

你必须做类似

的事情
<% if someCondition then %>
some html here
<% end if %>

<%

后没有等号

答案 3 :(得分:0)

使用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#的conditional (?:) operator的工作方式。这可能是混乱的根源。

答案 4 :(得分:0)

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

可在此处找到文档: IF operator on MSDN

答案 5 :(得分:0)

怎么样

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