验证ITemplate中的表单字段

时间:2009-03-13 04:24:00

标签: c# asp.net templates validation

我有一个自定义控件,其中包含以下定义的属性:

[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>

虽然页面按预期呈现,但它有许多不同严重程度的后果,包括:

  • 无法直接引用模板中包含的控件,并且需要FindControl。这很好。
  • 我一直无法对它们使用验证控件。

有没有更好的方法来设计我的自定义控件?或者只是一种让验证工作的方法?

2 个答案:

答案 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 });