具有相同修改的自定义控件验证器

custom control validator with same modification

我对3种BaseValidator做了同样的修改。我正在寻找一种删除重复代码的方法。

我为 RequiredFieldValidator 、 RegularExpressionValidator 和 CustomValidator 做了相同的代码

Public Class CustomValidator
    Inherits System.Web.UI.WebControls.CustomValidator

    Protected Overrides Sub Render(writer As HtmlTextWriter)

        Try
            If Not String.IsNullOrWhiteSpace(ControlToValidate) Then
                Dim ctv As Control = Me.FindControl(ControlToValidate)
                writer.AddAttribute("for", ctv.ClientID)
            End If
        Catch
        End Try

        MyBase.Render(writer)

    End Sub

    Protected Overrides ReadOnly Property TagKey() As System.Web.UI.HtmlTextWriterTag
        Get
            Return HtmlTextWriterTag.Label
        End Get
    End Property
End Class

我 运行 遇到了与这些 class 完全相同的问题;我想向验证控件添加一些附加功能。我最终共享一些公共代码的方式是实现我自己的 classes,它继承自验证器 classes,然后在实用程序 class 中实现共享逻辑。我不熟悉VB,所以请耐心等待C#示例。

public static class ValidationUtilities
{
    public static void AddFor(Control validationControl, string controlToValidate, HtmlTextWriter writer)
    {
        if (!string.IsNullOrWhiteSpace(controlToValidate))
        {
            var ctv = validationControl.FindControl(controlToValidate);
            writer.AddAddtribute("for", ctv.ClientID);
        }
    } 
}

class MyRegularExpressionValidator : RegularExpressionValidator
{
    protected override void Render(HtmlTextWriter writer)
    {
        ValidationUtilities.AddFor(this, ControlToValidate, writer);
    }
}

class MyRequiredFieldValidator : RequiredFieldValidator 
{
    protected override void Render(HtmlTextWriter writer)
    {
        ValidationUtilities.AddFor(this, ControlToValidate, writer);
    }
}

您可以提出这样的论点,即不复制少量代码会带来更多工作,但如果您有更多代码,或者您复制的代码在某种程度上很复杂,那么您可以通过这种方式分享它。此外,我将我的实用程序 class 设为静态,但没有理由不这样做。