Статьи

Подсказки для привязки данных. Часть 1. Связывание данных 101

Что не так с этим кодом?

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.

Хотите поиграть с кодом, использованным в приведенных выше примерах? Получить коды человек .

пнуть его на DotNetKicks.com если тебе это нравится.