asp.netですべてのコントロールのValidationGroupプロパティをグローバルに設定する最良の方法は?
-
07-07-2019 - |
質問
大規模な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#のコードサンプルが動作します。どうもありがとう!
解決
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; }
他のヒント
たとえばリテラルを継承するカスタムコントロールを作成します。このコントロールはヘルパーになります。
これをページに挿入し、すべての汚い仕事をしてもらいます。 例えばいくつかのロジックに基づいて、それを使い終わったら、出力コード(書くのに時間がかかります)。
その自動コードを取得し(別のコントロールによって実際に毎回実行されるのは非常に重くなります)、ヘルパーコントロールを削除し、必要な場所に新しいコードをハードコード配置します。
このようにして、コンピューターに希望のコードを理解させることですべてのミスを回避し、一般的な方法で問題を解決することで苦しむハードコーディングされた速度をすべて得ることができます。
私はちょうど同じことを探していたところ、突然私を襲った。 この方法を他の目的に使用します[すべてのコントロールをスキャン&amp;初期化コードを出力する]が、このメソッドを使用して簡単にこれを行うことができると思います!
作成したばかりで、あなたと共有します
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();
}
}