Как установить видимость элемента из кода

Я пытаюсь установить видимость элемента управления со страницы aspx из файла codebehind на основе свойства страницы, установленного в EPiServer. Соответствующий элемент управления кодируется так:

<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>

Я попробовал несколько разных способов сделать это, основываясь на этом предыдущем вопросе, но я не смог заставить его работать. Сначала я попробовал это:

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 ответ

Решение

Причина, по которой ваш первый пример не удался, заключается в том, что вы не можете ссылаться на другие члены экземпляра при инициализации поля экземпляра, как это делается (просто) до вызова конструктора, см. http://msdn.microsoft.com/en-us/library/ms173118.aspx

Ключевым моментом в этом случае является то, что свойства в EPiServer будут возвращать ноль, если они считаются пустыми. Это означает, что строковое свойство с пустым строковым значением вернет ноль, а логическое свойство с ложным значением также вернет ноль.

Так что в вашем случае, когда вы хотите присвоить булевому свойству значение, просто проверьте, возвращает ли свойство какое-либо значение.

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

или другой вариант - использовать метод IsValue класса PageBase для выполнения проверки.

DateVisible = !IsValue("HideDate");

Кроме того, поскольку вы используете строго типизированный тип страницы, вы можете просто использовать свойство на текущей странице (при условии, что свойство HideData было добавлено таким образом)

DateVisible = !CurrentPage.HideDate;

Наконец, вы также можете назначить видимое свойство непосредственно из вашего кода без необходимости проходить через поле DateVisible и DataBind.

public partial class Event : EPiServer.TemplatePage<EventPage>
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DateProp.Visible = !CurrentPage.HideDate;
    }
}
Другие вопросы по тегам