我正在尝试将UI控件绑定到以ASP.NET安全方式在ASP.NET页面上公开的业务对象。
使用'If'运算符是空安全的,但会导致编译器错误:
编译器错误消息:BC30201:预期的表达式。
使用'IIf'成功,但不是空的安全。我已经尝试了渲染表达式语法('<%=%>')绑定表达式语法('<%#%>'),但没有区别。
有人可以解释这种不一致,也许可以提供替代方案吗?
示例代码:
这有效: <%= IIf(Me.Foo Is Nothing,“”,Me.Foo.Id)%>
这会抛出编译器错误: <%= If(Me.Foo Is Nothing,“”,Me.Foo.Id)%>
答案 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) %>