【发布时间】:2014-07-04 05:56:55
【问题描述】:
我有一个派生自 WebControls.TableCell 的类。 设置 Text 属性后,我调用一个方法,将 asp:Panels 和 asp:LiteralControls 动态添加到 Cell。我想在 Javascript 中引用这些控件,所以自然我尝试在我的 JS 函数中使用面板的 ClientId。但是,这些控件没有设置 ClientId(字符串为空)。为什么是这样?如何强制设置 ClientIds?
作为一个临时解决方案,我将 ClientIDMode 设置为“静态”并自己创建了 ID,但这并不令人满意,因为在 JS 中很难引用这些 ID。为什么?例如,如果您将“12345”分配给一个控件,它会在客户端更改为“MainContent_123456”之类的内容。这很糟糕,因为“MainContent”部分不固定;因此我永远无法确定客户端的真实 ID 是什么。目前,我可以使用 jQuery 使用$ctrl = $('[id$='12345']'); 来获取控件,但这很脏,因为它会获取任何 ID 中包含“123456”的控件。
那么,回到最初的问题:如何在我的自定义 TableCells 中为我的面板自动设置 ClientIds?
编辑:添加代码
protected void Page_Load(object sender, EventArgs e)
{
this.ClientIDMode = System.Web.UI.ClientIDMode.Static;
}
将控件添加到自定义 TableCell 的方法中的代码:
Panel remainingTextPanel = new Panel();
remainingTextPanel.ID = Guid.NewGuid().ToString();
remainingTextPanel.Style["display"] = "none";
LiteralControl remainingText = new LiteralControl(myText.Substring(initialStringLength, myText.Length - initialStringLength));
remainingTextPanel.Controls.Add(remainingText);
this.Controls.Add(remainingTextPanel);
Panel linkBtnPanel = new Panel();
LinkButton lnkBtn = new LinkButton() {Text = "...", OnClientClick = "toggleDynamicText('" + remainingTextPanel.ID + "'); return false;" };
lnkBtn.Font.Bold = true;
linkBtnPanel.Controls.Add(lnkBtn);
this.Controls.Add(linkBtnPanel);
还有 JS 代码:
function toggleDynamicText(id) {
$ctrl = $('[id$=' + id + ']');
$(document).ready(function () {
$ctrl.toggle(1000);
});
}
【问题讨论】:
-
当 ClientIDMode 为静态时,它不会将“MainContent_”添加到您的 ID。这就是为什么它被称为静态的,因为它不会改变你分配给它的 ID。
-
我认为确实如此,因为这就是 Firebug 在客户端显示的内容。我在 Page_Load 中将 ClientIDMode 设置为静态,然后手动将控件的“ID”属性设置为随机字符串。在客户端,添加了“MainContent”部分,出于什么原因。
-
您使用的是什么版本的 .NET?
-
版本为 .NET 4.5。我认为最重要的问题是为什么我的自定义表格单元格(以及添加到其中的控件)在动态添加到页面时没有分配任何 ClientId。
标签: c# javascript asp.net clientid asp.net-customcontrol