簡體   English   中英

RequiredFieldValidator不在轉發器中工作

[英]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。

  1. 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獲取更多信息:

Control.ClientIDMode屬性

另外,關於ClientID和UniqueID之間差異的SO討論(在@MushinNoShin的答案中引用,恕我直言,這是不正確的):

為什么ClientID和UniqueID之間存在差異?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM