3

大規模なWebアプリケーション全体でかなり再利用されるフォームアイテムを含むユーザーコントロールがあります。この時点まで、無効なフォーム送信時の検証の概要は、ユーザーコントロールを使用する.aspxによって処理されています。

次に、フォームアイテムコントロール(テキストボックス、リスト、バリデーターなど)ごとに実行時にValidationGroupプロパティを設定する必要があります。各コントロールを手動で設定するのではなく、ユーザーコントロールのすべてのコントロールを反復処理し、そのコントロールにValidationGroupプロパティがあるかどうかを検出し、その値を設定することに関心があります。

このようなもの:

For Each ctrl As System.Web.UI.Control In Me.Controls
   ' so now what is the proper way to detect if this control has the ValidationGroup property
Next

vb.netまたはc#のコードサンプルは私のために働きます。どうもありがとう!

4

2 に答える 2

1

UserControlは、ValidationGroupプロパティをそれ自体の内部に適切に設定するプロパティを公開する必要があります。

.ASPXのコントロールマークアップ:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />

制御コード-.ASCXの背後:

 protected override void OnPreRender(EventArgs e)
 {
     someControl.ValidationGroup = YourValidationGroupProp;
     someControl1.ValidationGroup = YourValidationGroupProp;
     someControl2.ValidationGroup = YourValidationGroupProp;
     //......etc
 }    

 public string YourValidationGroupProp{ get; set; }
于 2009-09-15T03:16:00.357 に答える
1

たとえば、リテラルを継承するカスタムコントロールを作成します。このコントロールはヘルパーになります。

あなたはそれをページに挿入し、あなたのためにすべての汚い仕事をしてもらいます。たとえば、いくつかのロジックに基づいて、それが完了したら、出力コード[作成に多くの時間がかかります]。

その自動コードを取得し(実際に別のコントロールによって毎回実行されると非常に重要になります)、ヘルパーコントロールを削除し、新しいコードを必要な場所にハードコードして配置します。

このようにして、コンピュータに必要なコードを思い通りに理解させることですべての間違いを回避し、一般的な方法で問題を解決することによって苦しむハードコードされた速度をすべて得ることができます。

私はちょうど同じことを探していました、そしてそれは突然私を襲いました。私は他の目的でこのメソッドを使用します[すべてのコントロールをスキャンしていくつかの初期化コードを出力します]が、このメソッドを使用してこれを簡単に実行できると思います!

書いたばかりで、あなたと共有します

public class ValidationCodeProducerHelper : Literal
{
    // you can set this in the aspx/ascx as a control property
    public string MyValidationGroup { get; set; }

    // get last minute controls
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // start scanning from page subcontrols
        ControlCollection _collection = Page.Controls;
        Text = GetCode(_collection).Replace("\r\n", "<br/>");
    }

    private string GetCode(Control _control)
    {
        // building helper
        StringBuilder _output = new StringBuilder();

        // the logic of scanning
        if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
        {
            // the desired code
            _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
            _output.AppendLine();
        }

        // recursive search within children
        _output.Append(GetCode(_control.Controls));

        // outputting
        return _output.ToString();
    }

    private string GetCode(ControlCollection _collection)
    {
        // building helper
        StringBuilder _output = new StringBuilder();
        foreach (Control _control in _collection)
        {
            // get code for each child
            _output.Append(GetCode(_control));
        }
        // outputting
        return _output.ToString();
    }
}
于 2010-04-12T08:12:26.123 に答える