【问题标题】:NullReferenceException handling in in-line asp.net code内联 asp.net 代码中的 NullReferenceException 处理
【发布时间】:2011-02-16 03:27:15
【问题描述】:

我在一个执行的 aspx 文件中有一些内联代码:

<dd><%=  encode(Listing.Address.Line1) %> </dd>

问题是,在某些情况下,Listing 对象将为 null,因此对 Address 等属性的引用将引发异常。我该如何处理该异常?我基本上想忽略它:抓住它,然后继续定期执行/渲染页面。

【问题讨论】:

    标签: c# asp.net inline


    【解决方案1】:

    做一个空检查。测试您期望可能发生的异常的条件而不是处理它几乎总是更好。运行时必须做更多的工作来抛出和处理异常,而不是首先测试它并相应地处理它。

    <%= encode(Listing != null && Listing.Address != null ? Listing.Address.Line1 : string.Empty) %> 
    

    并且一定要检查地址以防万一。短路是你的朋友,&&ing 中的顺序很重要。

    如果没有看到更广泛的图景,我建议您的视图模型(如果有的话)有一种方法可以自动为您执行此操作。如果你到处都有,这种东西在视图中会变得很难看。

    【讨论】:

    • 哎呀,没看到你的,发布了几乎完全相同的东西。 +1。
    【解决方案2】:

    假设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 %>
    

    【讨论】:

      【解决方案3】:

      使用这个

      <%= if(Listing.Address.Line1 != null)
            { 
               encode(Listing.Address.Line1)
            }
      %> 
      

      【讨论】:

      • 如果列表为空,这将抛出完全相同的异常,正如他所描述的那样。在执行此操作之前,您没有测试列表是否存在。
      • 另外,if 语句不返回值,因此不能在&lt;%= %&gt; 标签中使用。
      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多