2016-10-14 5 views
1

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

繰り返しコードをユーティリティクラスに抽出し、3つの場所から呼び出します。 – Bert

+0

私はこの状況でそれを行う方法がわかりません。多分私はレンダリング機能の大きな部分(trycatch)を置くことができますが、それは非常に強力な変更ではありません。私は多重継承のようなパレードをもっと探していました。 – forX

答えて

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); 
    } 
} 

あなたはそれが少量のコードを複製しないための価値があるよりも、より多くの仕事だ議論をすることができますが、あなたはもっとたくさん持っている、またはあなたの重複コードは、何らかの方法で複雑な場合、これは道あなたですそれを共有することができます。また、私は自分のユーティリティクラスを静的にしましたが、別の方法ではできない理由はありません。

+0

私はホッピングしていた最善の方法ではありませんでしたが、それはまだ短いです。 "My"クラスの2番目の継承を持つことができれば、とても美しいかもしれません。 – forX

関連する問題