OnDataBinding vs Inline: плюсы, минусы и накладные расходы
Я подумал, что задаю этот вопрос, чтобы понять, почему многие примеры и люди предпочитают использовать встроенную привязку данных в коде aspx и реализовать событие OnDataBinding при использовании WebForms.
Для любого управления привязкой данных (например, Repeater, GridView и т.д.) Я всегда реализую метод OnDataBinding для элементов управления на уровне поля, если мне нужно делать что-либо, что не построено из коробки ( например, мне нужно сделать Eval). Большинство примеров, которые я вижу, имеют код справа на странице aspx, используя синтаксис inline <% #.
Пример встроенного кода ASP.NET:
<asp:Literal ID="litExample" runat="server"
Text='<%# Eval("ExampleField").ToString() %>' />
Пример того, как я предпочитаю это делать:
В aspx:
<asp:Literal ID="litExample" runat="server"
OnDataBinding="litExample_DataBinding" />
В codebehind.cs:
protected void litExample_DataBinding(object sender, System.EventArgs e)
{
Literal lit = (Literal)(sender);
lit.Text = string.Format("{1} - {2}",
Eval("ExampleField").ToString(),
Eval("ExampleField2").ToString());
}
Я лично предпочитаю метод codebehind, потому что он сохраняет мои страницы aspx чистыми, и у меня нет всего этого встроенного кода повсюду, и следующий парень просто знает, как всегда искать в файлах .cs для изменения кода. Разделение представления и кода также поддерживается лучше, так как HTML - это только владельцы мест, а кодовое кодирование определяет, что фактически вводится в управление.
Теперь это очень простые примеры. Это поле может быть целым числом, которое вы хотите форматировать с ведущими 0 или DateTime, которые нуждаются в определенном формате и т.д. Он также может принимать все виды манипуляций и кода, чтобы получить окончательное значение, которое должно быть сохранено в свойстве "Текст" в конец.
Где вы рисуете линию и переместите ее в код, если вы используете встроенный код?
Каковы плюсы и минусы для этого в любом случае?
Требуется ли больше накладных расходов, чем другие?
Редактировать Примечание: Я не говорю о назначении значения элементу управления, который находится только на странице, но который привязан к базе данных, потому что он существует в шаблоне ретранслятора или шаблоне элемента gridview и т.д... Очевидно, что буквально сидит на странице, которую вы можете просто назначить в коде.
Редактировать Примечание: Я думал, что я получу больше ответа, особенно в отношении накладных расходов. Большинство людей НЕ используют события OnDataBinding?
Ответы
Ответ 1
Там небольшая разница в производительности. Выражение для привязки данных анализируется и компилируется на что-то вроде
control.DataBinding += new EventHandler(ControlDataBinding);
а также
private void ControlDataBinding(object sender, EventArgs e) {
control.Text = Eval("Field");
}
В этом случае метод OnDataBinding не переопределяется. Выполняется базовый метод Control.OnDataBinding, который вызывает событие DataBinding, заставляя выполнение вышеуказанного кода.
Когда вы переопределяете OnDataBinding, вы просто принимаете участие перед запуском базового кода и сами можете установить свойство Text
(например).
Мне не нравится раздавать частичные ответы, но я сделаю это на этот раз, потому что думаю, что это аккуратно, и это спасло меня в последнее время:
Я сказал, что выражение привязки данных анализируется. Фактически, все разметки анализируются, код на С#, VB.NET или любой другой язык сгенерирован, и это они скомпилированы в класс. Когда запрашивается страница, создается экземпляр этого класса, и он начинает свою жизнь.
Вы можете найти эти сгенерированные файлы кода на диске, извините, я не помню, где. Интересная вещь о них заключается в том, что они все еще работают, как код.
Например, у меня недавно были некоторые довольно сложные сетки Infragistics, все форматирование завершено, а затем выяснилось, что мне нужно было установить форматирование в rumtime (чтобы получить правильный формат в экспортированные файлы Excel). Для этого я открыл исходный файл (все решетки были в одном пользовательском элементе управления) и смог извлечь конфигурацию каждой сетки в отдельную группу методов.
Мне удалось очистить их с помощью ReSharper, извлечь общие кодовые последовательности в базовый класс и оставить один статический метод для настройки каждой сетки. Затем я смог вызвать их как для начальной настройки, так и для настройки фиктивной сетки, используемой для экспорта Excel.
Ответ 2
Я предпочитаю противоположное. Я предпочитаю, чтобы мой код не ограничивался процедурным кодом и сохранял весь мой декларативный код на моей странице Aspx. В приведенном выше примере литерал абсолютно декларативный, и поэтому (по моим предпочтениям) не будет принадлежать коду. Гораздо более надежная функциональность, как правило, входит в мой код, и я не хочу, чтобы мои разработчики были загромождены, просеивая кучу строк инициализации, пытаясь понять это.
Ответ 3
Я предпочитаю это с помощью OnDataBinding. Вы можете сохранить свою кодовую клавиатуру чистой, используя область "Databind" для всех вызовов OnDataBinding, и вы можете сохранить свою разметку чистой, вытащив из этого ужасные серверные кодовые блоки.
Я думаю, что большинство людей делают это встроенным способом, потому что это легче понять и реализовать.
Ответ 4
На самом деле я предпочитаю использовать aspx для элементов управления, которые вы ожидаете привязать, например listview, gridview, повторитель и другие аналогичные элементы управления.
Для других элементов управления я бы установил их в codebehind, но прямо (как часть процесса, который я делаю, вместо вызова literal.DataBind или DataBind для всей страницы). Если это пользовательский/пользовательский элемент управления, я ожидаю, что вызывающие вызовы будут делать DataBind, тогда я бы переопределил DataBind и установил значения.
Тем не менее, у меня обычно есть много кода вне кода, и есть вызов для чего-то вроде ShowUser, где я помещаю эти назначения в элементы управления (вместо того, чтобы устанавливать свойство, а затем выполнять привязку и имея все эти оценки для простые элементы управления).
Ответ 5
Я согласен с калтропом. Мне нравится, чтобы моя разметка была чистой, и весь мой код aspx/ascx находился в моих файлах с кодом (где он принадлежит).
У меня есть только одна вещь для добавления. Я предпочитаю не засорять мой код событиями OnDataBinding(), проводными для каждого из моих элементов управления с помощью данных. Вместо этого я делаю все это в событии OnDataBinding() пользовательского элемента управления, которое внедряется в управляемый контроль (например, повторитель в вашем примере).
Например, в моем коде кода User Control вы найдете:
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
litExample.Text = Eval("ExampleField") + " - " + Eval("ExampleField2");
}
Здесь вы можете установить свойства всех своих элементов управления или вызвать другие методы для их установки. Обратите внимание, что в моем примере мне не нужно было выполнять бокс, как вы это делали: Literal lit = (Literal)(sender);
Это само по себе должно сэкономить вам на некоторой производительности (наносекунды, конечно, но что-то стоит оценить). Прочтите раздел "Производительность" здесь: http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vs.80%29.aspx
Я тоже воюю с использованием строк в моем коде. Я бы использовал либо строковые переменные const, чтобы определить "ExampleField" и "ExampleField2", либо настроить их как общедоступные свойства в User Control, которые затем могут быть заданы с помощью содержащего элемента управления/страницы на основе имени столбца объекта данных, который он будет быть связанными. Это обеспечивает большую гибкость и повторное использование элемента управления.
FYI: вам не нужно вызывать ToString() на Eval, так как этот метод уже возвращает строку.