2011-08-21 61 views
1

简短的问题: *需要深呼吸*使用JavaScript,发现.NET控件的ClientID的母版页内深嵌套

我怎能内表的TableRow的客户端ID添加到占位符,这是在用户控件使用MasterPage添加到SharePoint页面的Web部件内部?

解释:
我正在构建一个usercontrol,动态显示SPList项目,每个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 “点击” 显示属性showHidden('row999');,它将'row999'传递给JavaScript函数,但我无法弄清楚如何获取它引用的TableRow的完整clientId。

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

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

手指交叉!

凯文

+0

我想你会设置该行的'clientID'属性,然后你应该能够引用它,不是吗? –

+0

ClientID是一个只读字段,无法设置。我自己想过这件事,并发现了困难的方式:) – QMKevin

回答

2

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

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

+0

现在这是一个有趣的想法。只是测试添加'hiddenRow.CssClass =“行”+ itemId;'和网页源显示'class ='row999''很好!现在我只需要尝试一些自定义的'getElementByClassId'功能,我应该金!我会更新作为一个答案如果..不,当我开始工作。感谢您的想法。 – QMKevin

+0

而且,找到适当的getElementByClass()函数[这里](http://www.actiononline。 biz/web/code/how-to-getelementsbyclass-in-javascript-the-code /),我现在有了一个工作页面,而不必担心母版页,PlaceHolders等。 – QMKevin

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。

+0

不幸的是,jQuery在这一点上不是一个选项 - 我根本没有时间学习jQuery来做到这一点,特别是当这应该是可能的使用JavaScript作为它 - 这只是找出正确的语法。尽管 – QMKevin

+0

如果您使用Framework 4.0,还可以使用ClientIdMode来更好地控制生成的ClientId。我会用这个选项更新我的答案。 – Tys

+0

但是,对于SharePoint,我将使用4.0,但SharePoint是3.5或更低:( – QMKevin

相关问题