ObjectDataSource реагирует на закомментированный GridView?

2

Я столкнулся с очень странным поведением в asp.net ObjectDataSource, описание для воспроизведения несколько длиннее, поэтому несите меня, пока я устанавливаю сцену.

Итак, представьте себе тривиальный компилятор ObjectDataSource/GridView в User Control. Объект ObjectDataSource вызывает метод, который возвращает объект List объектов, а GridView показывает эти объекты в виде таблицы:

<div runat="server" ID="ControlWrapper">
    <asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
    </asp:GridView>

</div>

<asp:ObjectDataSource ID="ObjDataSource1" runat="server" SelectMethod="GetBundle" OnSelecting="FixDataSource_Selecting"  OnSelected="FixDataSource_Selected"
    TypeName="West.VitalSigns.Contracts.ProdFixController">
</asp:ObjectDataSource>

Этот подход будет работать практически не в коде. Но предположим, что мы хотим создать n число GridView -s в зависимости от содержимого базы данных. Поэтому мы комментируем GridView в разметке...

<div runat="server" ID="ControlWrapper">
<!--
<asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
    </asp:GridView>
-->
</div>

... и добавьте что-то вроде этого в обработчик событий ObjectDataSource Selected:

protected void FixDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs args)
    {
        HashSet<string> components = new HashSet<string<()
        foreach (ProdFix fix in (List<ProdFix>)args.ReturnValue)
        {
            if (!components.Contains(fix.Component))
            {
                GridView v = new GridView();
                v.ID=fix.Component.Replace(" " ,"").Replace("-","");
                v.AutoGenerateColumns = true;
                v.DataSource = args.ReturnValue;
                v.RowDataBound +=new GridViewRowEventHandler(BundleGrid_RowBound);
                ControlWrapper.Controls.Add(v);
                components.Add(fix.Component);

            }
        }
    }

Этот код работает (или, по крайней мере, не упрощенная версия работает на моей машине), поэтому вы решили удалить раздел с комментариями из разметки (не нужно, чтобы в этом случае крутилось!)

<div runat="server" ID="ControlWrapper">

</div>

Однако, когда вы это делаете, код больше не работает! Объект ObjectDataSource не запускается, что означает, что событие Selected никогда не произойдет, а это значит, что вы не получите GridView -s. Похоже, что ObjectDataSource реагирует на разметку с комментариями в файле aspx?

Итак, вот что:

  • Ошибка в ASP.NET?
  • Нестандартный способ динамического создания GridViews?
  • WTF, который я не должен был пробовать в любом случае?
  • Все вышесказанное?
Теги:
gridview

3 ответа

4
Лучший ответ

Ваш контроль сетки в разметке не скрыт, даже с комментариями. Комментарии HTML не применяются к тегам на стороне сервера. Вместо этого используйте комментарии на стороне сервера:

<% /* %>     <% */ %>

или

<%-– and -–%> 
  • 0
    Это на самом деле решение. Используйте ASP или код комментариев. HTML-комментарии не имеют особого значения для движка сервера asp.net.
0

Спустя 24 часа я заметил, что этот подход к получению N-номера сетки был довольно глупым. Вместо использования ObjectDataSource я реорганизовал свой код, чтобы просто вызвать метод GetBundle непосредственно из Page_Load() и программно создать GridViews.

cdonner имеет правильный ответ о комментариях на стороне сервера. Я не понимал, что есть разница.

0

Это тоже должно работать, поскольку вы "отключите" тег с ним:

<!--asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
    </asp:GridView-->

Ещё вопросы

Сообщество Overcoder
Наверх
Меню