ASP:扩展控制(ASCX)并从子类代码访问基本标记文件

时间:2010-01-29 20:58:37

标签: c# asp.net controls subclass visual-inheritance

我正在为我们的C#ASP应用程序构建表单验证控件。大部分工作由BaseValidator控件(子类System.Web.UI.UserControl)处理,该控件还具有验证输出的标记。然后通过PasswordValidator等子控件进行扩展,该子控件提供Validate方法以及该验证器控件所需的任何额外字段。

(最终目标是拥有像< uc1:PasswordValidator ControlId =“txtPassword”/>这样的控件,我们可以将这些控件放到任何形式中,且重复次数最少。)

但是,PasswordValidator.ascx.cs无法访问BaseValidator.ascx中定义的表单元素;我发现这样做的唯一方法是在每个子控件的* .ascx文件中复制标记。如何扩展BaseValidator.ascx.cs并在子类中访问BaseValidator.ascx的标记?

3 个答案:

答案 0 :(得分:0)

我很确定您必须创建服务器控件才能完成此任务。这意味着,您需要从控件中的代码而不是.ascx文件中生成输出的标记。

答案 1 :(得分:0)

如果您的PasswordValidator扩展了BaseValidator控件的真正基类,那么基类中的任何标记/控件都应该通过受保护的属性提供。我甚至会争辩说真正的基础不应该有ascx部分。基类应提供方法和属性,以便将控件公开给动态构建(可能在Page_Init期间维护视图状态)。

如果您在同一页面上有2个单独的控件,则可以修改您的父页面以提供经纪方法以允许此类通信。

如果您有PasswordValidator并且只需要控件/标记,则可以使用LoadControl method在内存中创建BaseControl实例,以编程方式访问其控件/标记,然后根据需要添加或销毁它关于你想用它做什么。

除此之外,就像@Shawn所说的那样。服务器控件。

答案 2 :(得分:0)

感谢您的建议。

我使用服务和策略模式解决了这个问题。有一个中央FieldValidator类,它为任何用户界面提供验证。对于Web界面,这些方法通过WebService和(通过WebService)公开UserControl。访问页面元素没有问题,因为现在只有一个UserControl类位于表单和WebService之间。

例如,<uc1:FieldValidator ControlType="Password" ControlToValidate="txtPassword" runat="server" >将完成功能齐全的客户端和服务器端验证,而不需要代码。大! :)

(我在回答我的问题时提到了一段时间的决议,但我无法将其标记为已回答。)