我有一个绑定到许多自定义数据项/类型的转发器
在转发器的itemdatabound事件上,代码调用一个renderit函数,该函数依赖于自定义数据类型将呈现自定义控件。它还将(如果设置了验证标志)为适当的渲染编辑控件呈现验证控件
编辑控件会覆盖自定义控件的CreateChildControls()方法,从而添加一些literalControls
protected override void CreateChildControls()
{
//other bits removed - but it is this 'hidden' control i am trying to validate
this.Controls.Add(new LiteralControl(string.Format(
"<input type=\"text\" name=\"{0}\" id=\"{0}\" value=\"{1}\" style=\"display:none;\" \">"
, this.UniqueID
, this.MediaId.ToString())
));
//some other bits removed
}
验证控件的呈现方式如下:传入的editcontrol是控件实例,上面的createchildcontrols是一个方法..
public override Control RenderValidationControl(Control editControl)
{
Control ctrl = new PlaceHolder();
RequiredFieldValidator req = new RequiredFieldValidator();
req.ID = editControl.ClientID + "_validator";
req.ControlToValidate = editControl.UniqueID;
req.Display = ValidatorDisplay.Dynamic;
req.InitialValue = "0";
req.ErrorMessage = this.Caption + " cannot be blank";
ctrl.Controls.Add(req);
return ctrl;
}
问题是,尽管验证控件.ControlToValidate属性设置为editcontrol的uniqueid。 当我点击页面时,我收到以下错误: 无法找到'FieldRepeater_ctl01_ctl00_validator'的'ControlToValidate'属性引用的控件ID'FieldRepeater $ ctl01 $ ctl00'。
我已经尝试将createchildcontrols中的文字更改为新的TextBox(),然后设置id等,但我遇到了类似的问题。
任何人都可以开导我吗? 这是因为控件的呈现顺序?即在editcontrol之前写入验证控件? 或者......无论如何任何帮助非常感谢
感谢
NAT
答案 0 :(得分:2)
您必须使用editControl.ID
而不是editControl.UniqueID
还要考虑如果editControl
必须是可以与必需的字段vaidator一起使用的东西。对于所有输入控件,这个验证器没有意义。
修改强>
检查此链接。它可能会有所帮助,因为它是你所需要的
http://support.microsoft.com/kb/310082