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

时间:2016-10-14 20:02:46

标签: asp.net vb.net custom-controls

我在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

1 个答案:

答案 0 :(得分:0)

我遇到了与这些确切类相同的问题;我想为验证控件添加一些额外的功能。我最终共享一些公共代码的方式是实现我自己的类,这些类继承自验证器类,然后在实用程序类中实现共享逻辑。我不熟悉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);
    }
}

你可以让这个论点比没有复制少量代码更有价值,但是如果你有更多,或者你的重复代码在某种程度上是复杂的,这是一种你可以共享的方式。另外,我使我的实用程序类保持静态,但是没有理由不这样做。