使用JavaScript,找到嵌套在母版页内的.NET控件的ClientID

时间:2011-08-21 15:08:00

标签: asp.net user-controls master-pages findcontrol

简短的问题: *需要深呼吸*

如何将TableRow中的ClientID添加到PlaceHolder中,PlaceHolder位于使用MasterPage添加到SharePoint页面的Web部件内的UserControl中?

解释:
我正在构建一个动态显示SPList项的usercontrol,每个Web.UI.Table()一个。 Table()的第二行将首先被隐藏,其中一个图像用于启动一些JavaScript来隐藏/显示客户端浏览器中的行(而不是使用回发或ajax - 我有理由)。

然后将Table()添加到UserControl中的PlaceHolder,然后由WebPart使用,并将WebPart添加到SharePoint页面,该页面当然使用MasterPage。我在制作JavaScript方法以找到TableRow的ClientID时遇到了麻烦,因为它嵌套得如此之深。

我的.ascx代码看起来像这样..

<script type="text/javascript">
function showHidden(itemId) {
    var controlId = document.getElementById('<%= phDownloadTable.ClientID %>');
    //alert(controlId);
    document.getElementById(controlId).style.display = (document.getElementById(controlId).style.display == "table-row") ? "none" : "table-row";
}
</script>

<asp:PlaceHolder ID="phTable" runat="server"></asp:PlaceHolder>

我的.cs代码隐藏是这样的......

Table myTable = new Table();
TableRow hiddenRow = new TableRow();
hiddenRow.ID = "row" + itemId;
hiddenRow.Attributes.Add("style","display: none;");

... create TableCells and add to hiddenRow...

TableRow displayRow = new TableRow();
TableCell toggleCell = new TableCell();
Image toggleImage = new Image();
toggleImage.ImageUrl = "/images/myimage";
toggleImage.Attributes.Add("onclick","javascript:showHidden('" + hiddenRow.ClientID + "');
toggleCell.Controls.Add(toggleImage);
displayRow.Cells.Add(toggleCell);

... create more TableCells and add to displayRow

myTable.Rows.Add(displayRow);
myTable.Rows.Add(hiddenRow);

结果是toggleImage“onclick”属性显示showHidden('row999');,它将'row999'传递给JavaScript函数,但我无法弄清楚如何获取它所引用的TableRow的完整clientId。 / p>

我的网页来源显示clientId为ctl00_SPWebPartManager1_g_eda9b9e9_4c7a_48e0_a2aa_fd8cdd65de6c_ctl00_row999,比我以前看到的要长,并且似乎包含两个'ct100_'部分,提示多个级别的控件。

任何想法都将不胜感激。我已经尝试了所有常用的途径(谷歌搜索'javascript .net控制客户端ID'等等,但到目前为止我还没有找到任何有用的东西。大多数建议document.getElementById('<%= myControl.ClientId %>')...这很好,但我不知道知道'myControl' - 我需要从切换图像发送。

手指越过!!

凯文

2 个答案:

答案 0 :(得分:2)

如果你不能设置客户端ID,你应该能够设置一个类,并且应该被.nat尊重。

他们可以按类名选择元素。

答案 1 :(得分:0)

JavaScript没有通配符选择选项。尝试使用jQuery,这会使事情变得更加灵活。 然后你可以使用类似的东西:

$("tr[id*='<%= phDownloadTable.ClientID %>']").css("display", your value);

这样你仍然可以找到合适的元素,即使它被移动到页面上的另一个地方。

以下是有关如何使用这些通配符选择器的更详细说明: http://api.jquery.com/attribute-contains-selector/

使用纯JavaScript,您可以执行document.getElementsByTagName('tr'),然后循环它们以找到正确的对象。

如果您使用的是Framework 4.0,则可以像这样设置页面的ClientIdMode:

Page.ClientIDMode = System.Web.UI.ClientIDMode.Static;

通过这种方式,您可以拥有更多可预测的客户端ID。例如,您可以拥有没有所有ctl00_前缀的id。