Что не так с этим кодом?
ASPX файл:
<p>
The time is now <asp:Literal runat="Server" ID="TimeContainer" />.
</p>
CodeBehind:
protected override void OnLoad(EventArgs e)
{
TimeContainer.Text = DateTime.Now.ToString();
}
Технически ничего. Но с точки зрения написания надежных, поддерживаемых приложений есть большая проблема. Если вы когда-нибудь захотите изменить этот текст интерфейса, вам, вероятно, нужно найти программиста и изменить код. В зависимости от того, какой тип проекта ASP.NET вы использовали, вам, возможно, придется пройти полное перераспределение, поскольку вам придется перекомпилировать приложение, чтобы изменить несколько слов в пользовательском интерфейсе. Это слишком много работы и слишком большой риск для моих вкусов.
Однако есть лучший способ: декларативное связывание данных.
ASPX:
<p runat="Server" id="DataBindingContainer">
The time is now <%# CurrentDateTime.ToString() %>.
<br />
And the current longdate is <%# CurrentDateTime.ToLongDateString() %>.
</p>
CodeBehind:
protected override void OnLoad(EventArgs e)
{
DataBindingContainer.DataBind();
}
protected DateTime CurrentDateTime
{
get { return DateTime.Now; }
}
Есть несколько вещей, которые следует отметить в отношении кода здесь. Во-первых, это вызов DataBindingContainer.DataBind (). Это связано с тем, что вы должны вызвать DataBind () контейнер с декларативно связанными элементами. Во-вторых, стоит отметить, как мы создали защищенное свойство для CurrentDateTime. Мы могли бы связываться непосредственно с DateTime.Now, но я решил показать это как защищенное свойство по причине: DataBinding фактически происходит в сгенерированном системой классе, который наследуется от вашей страницы, поэтому все, что вызывается из шаблона ascx, должно быть доступно для этот класс; частные переменные не должны применяться.
Вы можете удивиться, почему я застрял во втором выражении привязки данных, и причина проста: показать, что вы можете вызывать любой метод для любого объекта, к которому вы привязываете данные, а не только базовый вызов ToString (). Это строго типизированные вызовы полноразмерных объектов, так что вы можете вызывать все, что можете вызвать в своем коде.
Это довольно круто, Уайетт, но что, если я захочу немного логики?
Тогда вам нужно встретить нашего нового друга, троичного оператора:
<p>Daylight savings time <%# CurrentDateTime.IsDaylightSavingTime() ? "is" : "is not" %> in effect.</p>
Это очень полезный кусочек синтаксического сахара, который позволяет сжать простой оператор if до одной строки. Приведенный выше пример будет переводиться на:
private string GetDaylightSavingsStuff()
{
if (CurrentDateTime.IsDaylightSavingTime())
{
return "is";
}
else
{
return "is not";
}
}
Вы также можете использовать эту тактику для установки видимых свойств на серверных элементах управления. Например, скажем, мы хотели сделать небольшое объявление, если это на самом деле выходные:
<asp:PlaceHolder runat="Server" ID="DataBindingContainer">
<p>The time is now <%# CurrentDateTime.ToString() %>.</p>
<p>Daylight savings time <%# CurrentDateTime.IsDaylightSavingTime() ? "is" : "is not" %> in effect.</p>
<p runat="Server" id="Weekend" style="font-weight:bold; color: red" visible='<%# CurrentDateTime.DayOfWeek == DayOfWeek.Saturday || CurrentDateTime.DayOfWeek == DayOfWeek.Sunday ? true : false %>'>
ITS THE WEEKEND! What are you doing coding man!
</p>
<p runat="server" id="Weekday" style="font-weight:bold; color: blue" visible='<%# CurrentDateTime.DayOfWeek == DayOfWeek.Saturday || CurrentDateTime.DayOfWeek == DayOfWeek.Sunday ? false : true %>'>
ITS A WEEKDAY! Get back to work man!
</p>
</asp:PlaceHolder>
Теперь, в этот момент, вы задаетесь вопросом, что именно делать в ваших шаблонных элементах управления, таких как Repeater или GridView. И, для этой жемчужины знаний, вы должны быть настроены на DataBinding Protips Часть 2: Использование DataBinder.Eval для Fun и Profit.
Хотите поиграть с кодом, использованным в приведенных выше примерах? Получить коды человек .