ASP.NET动态控件和验证器 - 无法找到“...”的“ControlToValidate”属性引用的控件ID“...”

时间:2011-12-01 19:20:02

标签: asp.net updatepanel validation

我似乎有很多关于这个主题的论坛帖子/回复,但我并不接近解决方案。

我正在将DB中的重复数据结构加载到事件处理程序中的UpdatePanel控件中。重复次数各不相同,因此控制都会被创建并动态添加到容器面板中。用户可以编辑数据,因此我也可以动态创建验证器控件(RegularExpressionValidator s)

问题在于设置验证器的ControlToValidate属性。无论我如何设置它,我都会从服务器获得Unable to find control id '...' referenced by the 'ControlToValidate' property of '...'错误响应,然后由ASP.NET AJAX JS引发。

控件添加代码的简短版本如下所示:

TextBox licenseCode = new TextBox();
licenseCode.ID = this.getNextId();  // generated ID contains only [A-Za-Z], [0-9], :, -, .
licenseCode.MaxLength = 50;
this.purchaseEdit.Controls.Add(licenseCode);  // this.purchaseEdit is an asp:Panel

RegularExpressionValidator licenseCodeVal = new RegularExpressionValidator();
licenseCodeVal.ControlToValidate = licenseCode.ClientID;
licenseCodeVal.ID = this.getNextId();
licenseCodeVal.ValidationGroup = this.purchaseEditSave.ValidationGroup;  // save button within the panel
licenseCodeVal.ValidationExpression = @"^.{1," + licenseCode.MaxLength.ToString() + "}$";
licenseCodeVal.ErrorMessage = "Between 1 and " + licenseCode.MaxLength.ToString() + " chars.";
this.purchaseEdit.Controls.Add(licenseCodeVal);

正如您所看到的,两个控件都添加到同一容器中,验证器将添加到TextBox之后,并且ControlToValidate属性当前设置为TextBox的ClientID。我也尝试了ID值但没有快乐。

真正令人恼火的是,如果我不添加验证器,并使用断点检查TextBox的ClientID,我可以检查更新页面的DOM并找到TextBox的ID属性:

<input type="text" id="ctl00_ContentBody_PCTL::4890cc3a-8d07-4dee-aa9f-bdd8735fcaf8::licCode"... />

据我所知,我没有做错任何事,为什么我会收到这个错误?

任何建议都非常感谢。

2 个答案:

答案 0 :(得分:0)

您不应使用ClientID,而应使用TextBox的ID

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basevalidator.controltovalidate.aspx

  

“我也尝试了ID值但没有快乐。”

但你没有得到例外,只有验证不起作用?!

我的建议是将控件和验证器包装在UserControl中,并将其动态添加到容器控件中。通过这种方式,您可以使用修复ID,因为它们都具有不同的NamingContainers

代码会更清晰。封装还可以提高可重用性。

答案 1 :(得分:0)

ARGH所以我终于想出了这个东西 - 它归结为ID中的特殊字符。我遇到了一个包含':'的JQuery选择器的问题,并认为我应该检查是否导致验证器问题 - 它是。

最后我创建了没有任何连字符的GUID,并将':'替换为'_',问题就消失了。 This question帮了解。

我没有看到任何来自MSDN的内容,说ID中不允许使用某些字符,但是当我跳入时我倾向于引用具有特定问题的MSDN,所以也许那里有东西。 。见下面的评论