【问题标题】:ObjectDataSource reacts to commented-out GridView?ObjectDataSource 对注释掉的 GridView 做出反应?
【发布时间】:2009-05-27 18:27:02
【问题描述】:

我在asp.net的ObjectDataSource遇到了一个非常奇怪的行为,重现的描述有点长,所以在我设置场景时请多多包涵。

所以,想象一下用户控件中的一个简单的 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-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 中的错误?
  • 动态创建 GridView 的非标准方式?
  • 我不应该尝试的 WTF?
  • 以上所有?

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    即使使用 cmets,标记中的 gridview 控件也不会隐藏。 HTML cmets 不适用于服务器端标签。改用服务器端 cmets:

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

    <%-– and -–%> 
    

    【讨论】:

    • 这实际上是解决方案。使用 ASP 或代码 cmets。 HTML cmets 对 asp.net 服务器引擎没有特殊意义。
    【解决方案2】:

    24 小时后,我注意到这种获得 N 个网格视图的方法非常愚蠢。我没有使用ObjectDataSource,而是将我的代码重构为直接从Page_Load() 调用GetBundle 方法并以编程方式创建GridViews。

    cdonner 有关于服务器端 cmets 的正确答案。我没有意识到有区别。

    【讨论】:

      【解决方案3】:

      这也应该有效,因为您正在使用它“禁用”标签:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-18
        • 2013-11-18
        • 2017-11-08
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多