asp.net 网格视图行的 ID 在可预测客户端 ID 中时不会更改控件客户端 ID



我有一个gridview以如下格式呈现:

<div>
    <table>
        <thead>
            <tr><th></th></tr>
        </thead>
        <tbody>
            <tr><td></td></tr>
        </tbody>
    </table>
</div>

gridview/row等的子类为每一行添加一个id

row.ID = "item" + row.DataItemIndex.ToString();
row.ClientIDMode = Predictable;

但是当它被渲染到页面上时,行中控件的ClientID中没有这个id。

<TABLE>
    <TBODY>
        <TR id="MainContent_mygridview">
            <TD>
                <SPAN id="MainContent_mygridview_label1_0">This is on page one</SPAN>
            </TD>
        </TR>
        <TR id="MainContent_mygridview">
            <TD>
                <SPAN id="MainContent_mygridview_label1_1">This is on page one</SPAN>
            </TD>
        </TR>
    </TBODY>
    <TBODY>
        <TR id="MainContent_mygridview">
            <TD>
                <SPAN id="MainContent_mygridview_label1_0">This is on page two</SPAN>
            </TD>
        </TR>
        <TR id="MainContent_mygridview">
            <TD>
                <SPAN id="MainContent_mygridview_label1_1">This is on page two</SPAN>
            </TD>
        </TR>
    </TBODY>
</TABLE>

这成为一个问题,因为我在页面上有一些ajax,在请求时获得下一个"页面"值的行,并将它们添加到gridview(作为额外的tbody)。这会导致DOM中ID的冲突。

所以在挖掘之后,我发现可预测的id使用GridViewRowDisplayIndex属性。

int System.Web.UI.IDataItemContainer.DisplayIndex
{
    get
    {
        return this.DataItemIndex;
    }
}

我的子类:

public class GridViewRow : 
    System.Web.UI.WebControls.GridViewRow, System.Web.UI.IDataItemContainer

我不确定为什么子类需要,因为系统gridviewrow已经实现了那个接口,所以也许其他人可以添加到这个。
我也不确定这是否会破坏其他任何东西。

,但现在元素得到一个id,以他们的DataItemIndex结束,使他们在整个数据集中唯一,而不仅仅是"页"。

最新更新