如何从代码后面设置元素可见性

时间:2014-05-14 16:50:11

标签: c# asp.net episerver episerver-7

我正在尝试根据EPiServer中设置的页面属性,从代码隐藏文件中设置aspx页面中控件的可见性。相关控件的编码如下:

<asp:Content ContentPlaceHolderID="RelatedContent" runat="server">
    <p id="DateProp" runat="server" Visible ="<%# DateVisible %>"><strong>Date:</strong> <%= ((DateTime)CurrentPage["EventDate"]).ToString("d MMMM yyyy") %></p>
</asp:Content>

我已经尝试了几种不同的方法,基于this previous question,但我无法让它工作。首先,我尝试了这个:

public partial class Event : EPiServer.TemplatePage<EventPage>
    {
        public bool DateVisible = (bool)CurrentPage["HideDate"] == true ? false : true;

        protected void Page_Load(object sender, EventArgs e)
        {
            DataBind(); 
        }
    }

给出错误“Error 80 An object reference is required for the non-static field, method, or property EPiServer.PageBase<JamesTrustWF.Web.Models.Pages.EventPage>.CurrentPage.get'

然后我尝试了这个:

public partial class Event : EPiServer.TemplatePage<EventPage>
{
    public bool DateVisible = true;

    protected void Page_Load(object sender, EventArgs e)
    {
        DateVisible = (bool)CurrentPage["HideDate"] == true ? false : true;
        DataBind(); 
    }
}

给出错误“Object reference not set to an instance of an object”。知道怎么让它起作用吗?

1 个答案:

答案 0 :(得分:2)

您的第一个示例失败的原因仅仅是因为您在初始化实例字段时无法引用其他实例成员,因为这是在调用构造函数之前完成的(仅),请参阅http://msdn.microsoft.com/en-us/library/ms173118.aspx

在这种情况下,关键是EPiServer中的属性如果被认为是空的,则返回null。这意味着具有空字符串值的字符串属性将返回null,具有false值的Boolean属性也将返回null。

因此,在您的情况下,当您想为布尔属性赋值时,只需检查该属性是否返回任何值。

DateVisible = CurrentPage["HideDate"] == null;

或其他选项是使用PageBase类上的IsValue方法进行检查。

DateVisible = !IsValue("HideDate");

此外,由于您使用的是强类型页面类型,因此您可以在当前页面上使用该属性(假设已经以这种方式添加了HideData属性)

DateVisible = !CurrentPage.HideDate;

最后,您还可以直接从代码中分配visible属性,而无需通过DateVisible字段和DataBind。

public partial class Event : EPiServer.TemplatePage<EventPage>
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DateProp.Visible = !CurrentPage.HideDate;
    }
}