0

我正在尝试将 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。

4

2 回答 2

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

于 2013-06-26T20:53:15.860 回答
0

由于RequiredFieldValidator是客户端代码,因此需要使用控件的客户端 ID。像这样:

rfv.ControlToValidate = rblCondition.ClientID;

如果您有兴趣,请从 MSDN 获得更多信息:

Control.ClientIDMode 属性

此外,关于 ClientID 和 UniqueID 之间差异的 SO 讨论(如@MushinNoShin 的回答中所引用,恕我直言,这是不正确的):

为什么 ClientID 和 UniqueID 有区别?

于 2013-07-01T17:00:55.030 回答