【问题标题】:RequiredFieldValidator not working in a repeaterRequiredFieldValidator 在转发器中不起作用
【发布时间】:2013-06-24 11:28:10
【问题描述】:

我正在尝试将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 事件处理程序中创建控件。

标签: c# validation repeater


【解决方案1】:
  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();

【讨论】:

  • 一般我会建议使用 UniqueID 而不是 ClientID。使用 UniqueID 时出错的可能性较小,至少到目前为止我的经验是这样。
【解决方案2】:

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

rfv.ControlToValidate = rblCondition.ClientID;

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

Control.ClientIDMode Property

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

Why is there a difference between ClientID and UniqueID?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多