我似乎有很多关于这个主题的论坛帖子/回复,但我并不接近解决方案。
我正在将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"... />
据我所知,我没有做错任何事,为什么我会收到这个错误?
任何建议都非常感谢。
答案 0 :(得分:0)
您不应使用ClientID
,而应使用TextBox的ID
。
“我也尝试了ID值但没有快乐。”
但你没有得到例外,只有验证不起作用?!
我的建议是将控件和验证器包装在UserControl
中,并将其动态添加到容器控件中。通过这种方式,您可以使用修复ID,因为它们都具有不同的NamingContainers
。
代码会更清晰。封装还可以提高可重用性。
答案 1 :(得分:0)
ARGH所以我终于想出了这个东西 - 它归结为ID中的特殊字符。我遇到了一个包含':'的JQuery选择器的问题,并认为我应该检查是否导致验证器问题 - 它是。
最后我创建了没有任何连字符的GUID,并将':'替换为'_',问题就消失了。 This question帮了解。
我没有看到任何来自MSDN的内容,说ID中不允许使用某些字符,但是当我跳入时我倾向于引用具有特定问题的MSDN,所以也许那里有东西。 。见下面的评论