2011-12-01 101 views
0

我似乎在這個問題上有很多論壇帖子/回覆,但我沒有更接近到一個解決方案。ASP.NET動態控件和驗證器 - 無法找到'...'的'ControlToValidate'屬性引用的控件ID'...'

我正在從數據庫加載重複數據結構到事件處理程序中的UpdatePanel控件。重複的次數各不相同,所以控件都會被創建並動態添加到容器面板中。用戶有能力編輯數據,所以我也動態地創建驗證控件(RegularExpressionValidator s)

問題在於設置驗證程序的ControlToValidate屬性。無論我如何設置,我都會從ASP.NET AJAX JS引發的服務器中獲取Unable to find control id '...' referenced by the 'ControlToValidate' property of '...'錯誤響應。

控制添加代碼的短版看起來是這樣的:

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); 

正如你可以看到這兩個控件添加到同一容器中,驗證器的文本框後,並將ControlToValidate屬性是目前設置爲TextBox的ClientID。我也嘗試過ID值,但沒有喜悅。

真正刺激的是,如果我不加驗證,以及使用斷點檢查TextBox的ClientID的,我可以檢查更新頁面的DOM,並找到TextBox的ID屬性:

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

據我可以告訴我沒有做錯什麼,所以爲什麼我得到這個錯誤?

任何建議非常感謝。

+0

由於您在服務器端,爲什麼您要使用其客戶端ID而不是服務器ID來驗證控件? –

+0

正如我上面所說,我已經嘗試過兩種都沒有工作。使用服務器ID唯一的區別是,JS錯誤中的「缺失」ID沒有以ct100爲前綴... – tomfumb

回答

0

ARGH所以我終於想出了這件事 - 它歸結爲ID中的特殊字符。我遇到了一個包含':'的JQuery選擇器的問題,並認爲我應該檢查是否導致驗證器問題 - 這是。

最後,我創建了沒有任何連字符的GUID,並用'_'替換':',問題就消失了。 This question幫助。

我還沒有看到任何來自MSDN的說某些字符不被允許在ID中,但是我傾向於在跳入後引用具有特定問題的MSDN,所以也許在那裏有東西。 。請參閱下面的評論

+1

>>我沒有看到任何MSDN表示在ID中不允許使用某些字符 來自MSDN Control.ID':「只有字母數字字符和下劃線字符(_)的組合是該屬性的有效值。或其他無效字符將導致ASP.NET頁面分析器錯誤。「 – JonBrave

0

您不應該使用文本框的ClientID而是ID

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

「我已經嘗試了ID值太大,但沒有喜悅。」

但是你沒有得到一個例外,只有驗證不起作用?!

我的建議是將控件和驗證器封裝在UserControl中,並將其動態添加到容器控件中。這樣你就可以使用修復ID,因爲它們都有不同的NamingContainers

該代碼將更清潔。封裝也增加了可重用性。

+0

ID而不是ClientID引發相同的錯誤,但沒有ct100 ...前綴。在你的建議中,我看到了你所得到的,但是在其他領域使用控制ID,這意味着一個重大變化 - 本身並不是一個大問題,但我真的不知道它是如何解決我的問題的:在兩個我目前和你的建議方案我有一個驗證器引用一個ID * *不存在於同一個容器中。 – tomfumb

+0

您提供的信息太少。 1)什麼'getNextId()'爲ID生成。顯示功能。 2)您在何時何地創建控件?你是否在*每次*回發中重新創建它們,並且與之前的*號相同?通常,使用存儲在ViewState變量中的計數器來獲取/設置創建的控件的數量就足夠了,以便您可以在Page_Init中或最後在Page_Load中重新創建它們(事件太遲)。 –

+0

感謝您的支持:) 1)我提供了一個ID - PCTL :: 4890cc3a-8d07-4dee-aa9f-bdd8735fcaf8 :: licCode上面的例子 - 用一個不變的前綴,後綴,分隔符和一個新的GUID構建。 2)UpdatePanel在點擊按鈕後發佈帖子,在處理程序中獲取數據庫數據並循環,爲每個條目創建一組控件和驗證程序。該ID會更改每個帖子,但常用ID始終會加入TextBox及其驗證程序。你是說事件處理程序來創建驗證程序爲時已晚?請注意,當我註釋掉驗證器時,我的TextBox被創建得很好(來自處理程序)。 – tomfumb