0

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

(最终目标是拥有像 <uc1:PasswordValidator ControlId="txtPassword" /> 这样的控件,我们可以以最少的重复将其放入任何形式。)

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

4

3 回答 3

0

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

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

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

除非是这样,否则就像@Shawn 所说的那样。服务器控制。

于 2010-01-29T22:02:07.307 回答
0

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

于 2010-01-29T21:47:08.463 回答
0

感谢您的建议。

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

例如,<uc1:FieldValidator ControlType="Password" ControlToValidate="txtPassword" runat="server" >将关闭功能齐全的客户端和服务器端验证,而无需后面的代码。伟大的!:)

(我在回答我的问题时提到了解决方案,但我无法将其标记为已回答。)

于 2010-03-17T04:57:00.717 回答