Asp.net 为什么呈现不可见的asp:占位符中的内容?

Asp.net 为什么呈现不可见的asp:占位符中的内容?,asp.net,visibility,asp.net-4.5,asp.net-placeholder,Asp.net,Visibility,Asp.net 4.5,Asp.net Placeholder,为什么呈现占位符中的内容? 此代码导致:“对象引用未设置为对象的实例。” 对于MainGuard对象 如何处理这种情况? <asp:PlaceHolder runat="server" Visible="<%# Model.MainGuard != null %>"> <asp:Image runat="server" ImageUrl="<%# Model.MainGuard.Image.RenderImage() %>" Height="50

为什么呈现占位符中的内容? 此代码导致:“对象引用未设置为对象的实例。” 对于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: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);
}
public静态字符串StringOrEmpty(此MyClass自身,Func选择器)
{
如果(self==null)返回“”;
返回选择器(自身);
}
然后你可以写:

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

mainGuard.Name)%%>
它没有被呈现——但是它仍然需要由运行时解析,因此您仍然会得到异常。您唯一的办法是每次检查空值:

<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);
}
public静态字符串StringOrEmpty(此MyClass自身,Func选择器)
{
如果(self==null)返回“”;
返回选择器(自身);
}
然后你可以写:

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

mainGuard.Name)%%>

好吧-我只是觉得奇怪,没有更干净的方法。。但是谢谢-扩展方法使它可以接受..我将它更改为一个泛型:
公共静态字符串StringOrEmpty(这个T self,Func选择器),其中T:new()
好的-我只是觉得奇怪,没有更干净的方法。。但是谢谢-扩展方法使它可以接受..我将它更改为一个泛型:
publicstaticstringorempty(这个T self,Func选择器),其中T:new()