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