【发布时间】:2011-02-16 03:27:15
【问题描述】:
我在一个执行的 aspx 文件中有一些内联代码:
<dd><%= encode(Listing.Address.Line1) %> </dd>
问题是,在某些情况下,Listing 对象将为 null,因此对 Address 等属性的引用将引发异常。我该如何处理该异常?我基本上想忽略它:抓住它,然后继续定期执行/渲染页面。
【问题讨论】:
我在一个执行的 aspx 文件中有一些内联代码:
<dd><%= encode(Listing.Address.Line1) %> </dd>
问题是,在某些情况下,Listing 对象将为 null,因此对 Address 等属性的引用将引发异常。我该如何处理该异常?我基本上想忽略它:抓住它,然后继续定期执行/渲染页面。
【问题讨论】:
做一个空检查。测试您期望可能发生的异常的条件而不是处理它几乎总是更好。运行时必须做更多的工作来抛出和处理异常,而不是首先测试它并相应地处理它。
<%= encode(Listing != null && Listing.Address != null ? Listing.Address.Line1 : string.Empty) %>
并且一定要检查地址以防万一。短路是你的朋友,&&ing 中的顺序很重要。
如果没有看到更广泛的图景,我建议您的视图模型(如果有的话)有一种方法可以自动为您执行此操作。如果你到处都有,这种东西在视图中会变得很难看。
【讨论】:
假设Listing 不为空的问题相当简单,因此,它的所有基础属性都不为空,您可以键入如下内容:
您可以在此处使用构造函数编写Listing 类,这样Address.Line1 将始终具有值。
现在,如果您的问题相当复杂,Listing 对象可能有一个有效的实例,但它的底层属性可能没有:最好的方法是将 encode 方法包装到另一个方法或属性中,这将返回预期的结果,并在标记中调用它。
public string EncodedAddress
{
get
{
if (Listing == null)
return string.Empty;
if (Listing.Address == null)
return string.Empty;
return encode(Listing.Address.Line1);
}
}
在标记中,您可以执行以下操作:
<%= EncodedAddress %>
【讨论】:
使用这个
<%= if(Listing.Address.Line1 != null)
{
encode(Listing.Address.Line1)
}
%>
【讨论】:
if 语句不返回值,因此不能在<%= %> 标签中使用。