我有一个自定义控件,其中包含以下定义的属性:
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate Template {
get { return template; }
set { template = value; }
}
该控件覆盖CreateChildControls(),并添加了几个HtmlGenericControls和一个asp:Panel控件。
控件的实际实现看起来像这样:
<user:Frame runat="server">
<Template>
<asp:Literal runat="server" ID="SomeControl" Text="SomeValue" />
</Template>
</user:Frame>
虽然页面按预期呈现,但它有许多不同严重程度的后果,包括:
有没有更好的方法来设计我的自定义控件?或者只是一种让验证工作的方法?
答案 0 :(得分:1)
默认情况下,框架假定您在控件中可能有多个模板,例如在Repeater中。在您的情况下,您必须通过使用TemplateInstance属性告诉它您打算使用单个模板。 E.g。
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Template {
get { return template; }
set { template = value; }
}
这将允许您直接引用模板化控件,并且还应该修复您的验证问题。
答案 1 :(得分:1)
在这种情况下,验证工作的一种方法是以编程方式添加验证控件。例如:
var c = parentControl.FindControl("id");
parentControl.Controls.AddAt(
parentControl.Controls.IndexOf(c) + 1,
new RequiredFieldValidator() { ControlToValidate = c.D });