Как установить видимость элемента из кода
Я пытаюсь установить видимость элемента управления со страницы 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;
}
}