【问题标题】:Validating Form Fields in an ITemplate验证 ITemplate 中的表单字段
【发布时间】:2009-03-13 04:23:59
【问题描述】:

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

[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。这很好。
  • 我无法对它们使用验证控件。

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

【问题讨论】:

    标签: c# asp.net templates validation


    【解决方案1】:

    默认情况下,框架假定您在控件中可能有多个模板,例如在中继器中。在您的情况下,您必须使用 TemplateInstance 属性告诉它您打算拥有一个模板。例如

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    public ITemplate Template { 
      get { return template; }
      set { template = value; }
    }
    

    这将允许您直接引用模板化控件,并且还应该解决您的验证问题。

    【讨论】:

      【解决方案2】:

      在这种情况下使验证工作的一种方法是以编程方式添加验证控件。例如:

      var c = parentControl.FindControl("id");
      
      parentControl.Controls.AddAt(
         parentControl.Controls.IndexOf(c) + 1,
         new RequiredFieldValidator() { ControlToValidate = c.D });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多