Я столкнулся с очень странным поведением в 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?
Итак, вот что:
Ваш контроль сетки в разметке не скрыт, даже с комментариями. Комментарии HTML не применяются к тегам на стороне сервера. Вместо этого используйте комментарии на стороне сервера:
<% /* %> <% */ %>
или
<%-– and -–%>
Спустя 24 часа я заметил, что этот подход к получению N-номера сетки был довольно глупым. Вместо использования ObjectDataSource
я реорганизовал свой код, чтобы просто вызвать метод GetBundle
непосредственно из Page_Load() и программно создать GridViews.
cdonner имеет правильный ответ о комментариях на стороне сервера. Я не понимал, что есть разница.
Это тоже должно работать, поскольку вы "отключите" тег с ним:
<!--asp:GridView ID="GridView1" AutoGenerateColumns="true" DataSourceID="ObjDataSource1" OnRowDataBound="GridView1_RowBound" runat="server">
</asp:GridView-->