【问题标题】:Why is the content inside the invisible asp:PlaceHolder rendered?为什么不可见的 asp:PlaceHolder 里面的内容会渲染?
【发布时间】:2023-03-22 07:41:01
【问题描述】:

为什么会渲染占位符内的内容? 此代码导致:“对象引用未设置为对象的实例。” 对于 MainGuard 对象!

应该如何处理这种情况?

<asp:PlaceHolder runat="server" Visible="<%# Model.MainGuard != null %>">
    <asp:Image runat="server" ImageUrl="<%# Model.MainGuard.Image.RenderImage() %>" Height="50" />
    <%# Model.MainGuard.Name %>
</asp:PlaceHolder>

【问题讨论】:

    标签: asp.net visibility asp.net-4.5 asp.net-placeholder


    【解决方案1】:

    它没有被渲染——但它仍然必须由运行时解析,因此你仍然会得到异常。您唯一的办法是每次都检查 null:

    <asp:Image runat="server"
        ImageUrl="<%# Model.MainGuard == null ? "" : Model.MainGuard.Image.RenderImage() %>" />
    <%# Model.MainGuard == null ? "" : Model.MainGuard.Name %>
    

    您可以考虑使用扩展方法来实现更简洁的语法:

    public static string StringOrEmpty(this MyClass self, Func<MyClass, string> selector)
    {
        if (self == null) return "";
    
        return selector(self);
    }
    

    然后你可以写:

    <asp:Image runat="server"
        ImageUrl="<%# Model.MainGuard.StringOrEmpty(mainGuard => mainGuard.Image.RenderImage()) %>" />
    <%# Model.MainGuard.StringOrEmpty(mainGuard => mainGuard.Name) %>
    

    【讨论】:

    • 好的 - 我只是觉得奇怪的是没有更清洁的方法..但是谢谢 - 扩展方法使它可以接受..
    • 我把它改成了泛型:public static string StringOrEmpty&lt;T&gt;(this T self, Func&lt;T, string&gt; selector) where T : new()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多