[英]RequiredFieldValidator not working in a repeater
我正在嘗試動態地將一個RequiredFieldValidator添加到轉發器中的RadioButtonList,但它失敗並顯示錯誤:
Unable to find control id 'rblAccessory_40' referenced by the 'ControlToValidate' property of ''.
本節的代碼是:
if ((e.Item.ItemType != ListItemType.Header) && (e.Item.ItemType != ListItemType.Footer))
{
Label lblAccID = (Label)e.Item.FindControl("lblAccID");
RadioButtonList rblCondition = (RadioButtonList)e.Item.FindControl("rblCondition");
rblCondition.ID = "rblAccessory_" + lblAccID.Text;
if (conditionList.Count() > 0)
{
RequiredFieldValidator rfv = new RequiredFieldValidator();
rfv.ControlToValidate = "rblAccessory_" + lblAccID.Text;
rfv.ErrorMessage = "Please complete the accessories section";
pnlValidation.Controls.Add(rfv);
rblCondition.DataSource = conditionList;
rblCondition.DataValueField = "id";
rblCondition.DataBind();
}
foreach (ListItem li in rblCondition.Items)
{
li.Text = "";
li.Value = "AccessoryID_" + lblAccID.Text + "-ConditionID_" + li.Value;
}
}
}
它肯定找到了RadioButtonList(rblCondition),因為此時數據正確綁定:
rblCondition.DataSource = conditionList;
rblCondition.DataValueField = "id";
rblCondition.DataBind();
所以我不明白為什么錯誤說它無法找到控件ID。
我已經嘗試手動指定控件ID,如下所示:
rfv.ControlToValidate = "rblAccessory_" + lblAccID.Text;
並嘗試過:
rfv.ControlToValidate = rblCondition.ID;
lblAccID是一個隱藏文本字段,用於存儲轉發器中行的ID。
ItemCreated
事件之后分配控件以驗證屬性。 我知道這聽起來很奇怪,你怎么還能引用動態創建的控件呢? 我通過保持對List<Action>
引用的引用來解決這個問題,我將在ItemCreated
添加內容以便稍后執行。 在您的控件類中,您將聲明List<Action>
對象:
List<Action> deferringControlToValidateUntilPreRender = new List<Action>();
在ItemCreated
事件中,您將看到如下所示的行:
deferringControlToValidateUntilPreRender.Add(() => rfv.ControlToValidate = rblCondition.UniqueID);
然后,也許在PreRender
:
foreach(var deferredAction in deferringControlToValidateUntilPreRender) action();
由於RequiredFieldValidator
是客戶端代碼,因此您需要使用控件的客戶端ID。 像這樣:
rfv.ControlToValidate = rblCondition.ClientID;
如果您感興趣,可以從MSDN獲取更多信息:
另外,關於ClientID和UniqueID之間差異的SO討論(在@MushinNoShin的答案中引用,恕我直言,這是不正確的):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.