ObjectDataSource реагирует на закомментированный GridView? - PullRequest
2 голосов
/ 27 мая 2009

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

Итак, представьте тривиальную комбинацию ObjectDataSource / GridView в пользовательском элементе управления. 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 в зависимости от содержимого базы данных. Поэтому мы закомментируем GridView в разметке ...

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

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

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, который я не должен был попробовать в любом случае?
  • Все вышеперечисленное?

Ответы [ 3 ]

4 голосов
/ 27 мая 2009

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

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

или

<%-– and -–%> 
0 голосов
/ 29 мая 2009

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

<!--asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
    </asp:GridView-->
0 голосов
/ 29 мая 2009

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

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

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