Лучшие практики при применении условного форматирования в элементах управления с привязкой к данным? - PullRequest
1 голос
/ 02 января 2009

У меня есть контроллер Repeater, привязанный к пользовательскому объекту (запрос EntitySpaces), и я заметил, что есть несколько способов условно отформатировать отображаемые значения.

1) Из моего aspx я могу вызвать метод в моем программном коде, пройти через связанное значение и использовать его для управления любой условной логикой:

        <a class="star" href="<%#MakePackageSelectionUrl((int)DataBinder.Eval(Container.DataItem, "PackageId"))%>">

and then in the code-dehind:

    protected string MakePackageSelectionUrl(int packageId)
    {
              return string.Format("/Packages/NoAjax/ToggleStar.aspx?p={0}&amp;s={1}&amp;st={2}", packageId, _streamId, (int)_phase);
    }

2) Я могу подключиться к событию ItemDataBound, получить e.Item.DataItem в качестве DataRowView, а затем сойти с ума:

    protected void PackageList_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) { return; }

        DataRowView details = (DataRowView)e.Item.DataItem;

        EncodePackageName(e, details);
        EncodeStatusName(e);
        DisplayStarImage(e, details);
    }

    private static void EncodePackageName(RepeaterItemEventArgs e, DataRowView dr)
    {
        HtmlAnchor p = (HtmlAnchor)e.Item.FindControl("packageLink");
        if (p != null)
        {
            p.HRef = string.Format("/Packages/View.aspx?p={0}", dr["packageId"]);
            p.InnerHtml = HttpUtility.HtmlEncode((string)dr["packageName"]);
        }
    }

Я также заметил, что использование e.Item.FindControl () в выделенном фрагменте кода требует runat = "server" для элемента управления в aspx, который имеет неприятную привычку кодировать идентификаторы и вообще портить HTML. 1009 *

Мне очень хотелось бы услышать от любого, кто придумал хороший подход для решения подобных проблем.

Ответы [ 2 ]

1 голос
/ 07 января 2009

В этом случае все, что вы делаете, это манипулируете каким-то HTML, поэтому я бы использовал первый метод. Второй метод подходит для случаев, когда необходимо проверить привязываемый элемент данных и в ответ внести изменения в серверные элементы управления (например, связывание вложенных списков).

Обратите внимание также, что вызовы DataBinder.Eval () дороги - он использует отражение. Вы получите лучшую производительность, используя явное приведение, например:

MakePackageSelectionUrl(((System.Data.DataRowView)Container.DataItem)["PackageId"])

Для справки: http://msdn.microsoft.com/en-us/library/ms998549.aspx. См. Раздел о минимизации вызовов в DataBinder.Eval.

1 голос
/ 02 января 2009

Keep It Simple.

Чем больше кода вы пишете (даже если он повторяется), тем больше ошибок может появиться.

Я предпочитаю первый метод, так как вам не нужен обработчик событий, и сохраняйте все ваше форматирование в отдельном классе, если используется более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...