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