/// <summary>
/// Web コントロール群の論理検証オペレータ
/// </summary>
public class WebControlsOperator
{
/// <summary>バリデータ群保持ディクショナリ。</summary>
/// <remarks>
/// ASP.NET 標準バリデータおよび拡張論理検証バリデータの統合コンテナ。
/// </remarks>
private IDictionary<string, IList<IValidator>> validators = new Dictionary<string, IList<IValidator>>();
/// <summary>サーバー側での論理検証用バリデータの追加。</summary>
/// <param name="validator">サーバー側での論理検証用バリデータ</param>
/// <remarks>
/// コンテナ内での管理キーは ClientID です。これはカスタムコントロール下の
/// コントロール ID 重複に配慮したものです。
/// </remarks>
public void AddLogicalValidator(LogicalValidator validator)
{
if (validator.WebControl != null)
{
if (this.validators.ContainsKey(validator.WebControl.ClientID))
{
this.validators[validator.WebControl.ClientID].Add(validator);
}
else
{
IList<IValidator> list = new List<IValidator>();
list.Add(validator);
this.validators.Add(validator.WebControl.ClientID, list);
validator.ClearControlStyle();
}
}
else
{
if (this.validators.ContainsKey(validator.ValidatorDTO.ToString()))
{
this.validators[validator.ValidatorDTO.ToString()].Add(validator);
}
else
{
IList<IValidator> list = new List<IValidator>();
list.Add(validator);
this.validators.Add(validator.ValidatorDTO.ToString(), list);
}
}
}
/// <summary>バリデーションの実行。</summary>
/// <remarks>
/// ASP.NET の標準バリデーションの実行、及びコンテナ内の独自定義した
/// 論理検証用バリデータの一括実行。
/// </remarks>
public void Validate()
{
foreach (IList<IValidator> list in this.validators.Values)
foreach (IValidator val in list)
val.Validate();
}
/// <summary>バリデーション結果メッセージリストの取得。</summary>
/// <param name="manager">ResourceManager</param>
/// <returns>メッセージ文言リスト</returns>
public IList<string> GetValidatedMessages(System.Resources.ResourceManager manager)
{
IList<string> conIds = new List<string>();
IList<string> ret = new List<string>();
foreach (IList<IValidator> list in this.validators.Values)
{
foreach (IValidator validator in list)
{
if (validator.IsValid == false)
{
// 1項目のエラーメッセージ数は1個になります
if (validator is LogicalValidator)
{
string id;
if (((LogicalValidator)validator).WebControl != null)
id = ((LogicalValidator)validator).WebControl.ClientID;
else
id = ((LogicalValidator)validator).ValidatorDTO.ToString();
if (conIds.Contains(id))
continue;
else
conIds.Add(id);
}
else
{
// TODO ASP.NET の標準バリデーション
}
if (validator is LogicalValidator)
ret.Add(((LogicalValidator)validator).GetErrorMessage(manager));
else
ret.Add(validator.ErrorMessage);
}
}
}
return ret;
}
}
====================
/// <summary>
/// サーバー側での論理検証用バリデータ基底抽象クラス。
/// </summary>
public abstract class LogicalValidator : IValidator
{
private Control webControl;
/// <summary>検証対象 Web コントロールへの参照。</summary>
public Control WebControl { get { return webControl; } }
private string uiCaption;
/// <summary>UI 上で特に指定された項目名キャプション。</summary>
public string UICaption { get { return uiCaption; } }
private string valuePropertyName;
/// <summary>検証対象 Web コントロールの値を取得するプロパティ名</summary>
public string ValuePropertyName { get { return valuePropertyName; } }
private IValidatorDTO validatorDto;
/// <summary>検証対象 DTOへの参照。</summary>
public IValidatorDTO ValidatorDTO { get { return validatorDto; } }
/// <summary>エラーメッセージ(ID)プロパティ。</summary>
/// <value>エラーメッセージ(ID)</value>
/// <remarks>
/// 本プロジェクトにおいては、エラーメッセージ ID を設定します。
/// </remarks>
public string ErrorMessage { get; set; }
/// <summary>検証結果プロパティ。</summary>
/// <value>true : 問題無し/false : 問題あり</value>
public bool IsValid { get; set; }
/// <summary>検証を実行します。</summary>
/// <remarks>
/// 検証を実行し、結果を IsValid に設定します。問題を検出した場合には
/// エラーメッセージに問題の内容を設定します。
/// </remarks>
public abstract void Validate();
/// <summary>
/// エラーメッセージ文言を戻します。
/// </summary>
/// <param name="manager">ResourceManager</param>
/// <remarks>
/// 各バリデータで独自に定義された整形済みメッセージ文言を戻します。
/// </remarks>
/// <returns>メッセージ文言</returns>
public abstract string GetErrorMessage(ResourceManager manager);
/// <summary>
/// コントロールのスタイルを設定する
/// </summary>
protected void SetControlStyle()
{
if (!this.IsValid)
{
PropertyInfo errTarget = this.WebControl.GetType().GetProperty("HasError");
if (errTarget != null && errTarget.CanWrite)
errTarget.SetValue(this.WebControl, true, null);
}
}
public void ClearControlStyle()
{
PropertyInfo errTarget = this.WebControl.GetType().GetProperty("HasError");
if (errTarget != null && errTarget.CanWrite)
errTarget.SetValue(this.WebControl, false, null);
}
/// <summary>コンストラクタ。</summary>
/// <param name="webControl">検証対象 DTOへの参照</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <param name="valuePropertyName">検証対象 Web コントロールの値を取得するプロパティ名</param>
/// <remarks>
/// 検証対象 Web コントロールへの参照を保持します。
/// </remarks>
public LogicalValidator(IValidatorDTO validatorDto, string uiCaption, string valuePropertyName)
{
this.validatorDto = validatorDto;
this.uiCaption = uiCaption;
this.valuePropertyName = valuePropertyName;
}
/// <summary>コンストラクタ。</summary>
/// <param name="webControl">検証対象 Web コントロールへの参照</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <param name="valuePropertyName">検証対象 Web コントロールの値を取得するプロパティ名</param>
/// <remarks>
/// 検証対象 Web コントロールへの参照を保持します。
/// </remarks>
public LogicalValidator(Control webControl, string uiCaption, string valuePropertyName)
{
this.webControl = webControl;
this.uiCaption = uiCaption;
this.valuePropertyName = valuePropertyName;
}
/// <summary>コンストラクタ。</summary>
/// <param name="webControl">検証対象 Web コントロールへの参照</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <remarks>
/// 検証対象 Web コントロールへの参照を保持します。
/// </remarks>
public LogicalValidator(Control webControl, string uiCaption)
{
this.webControl = webControl;
this.uiCaption = uiCaption;
this.valuePropertyName = "Text";
}
/// <summary>コンストラクタ。</summary>
/// <param name="webControl">検証対象 Web コントロールへの参照</param>
/// <remarks>
/// 検証対象 Web コントロールへの参照を保持します。
/// </remarks>
public LogicalValidator(Control webControl)
{
this.webControl = webControl;
this.uiCaption = "";
this.valuePropertyName = "Text";
}
}
======================
/// <summary>
/// 必須項目を検証するバリデータ
/// </summary>
public class RequiredValidator : LogicalValidator
{
/// <summary>検証を実行します。</summary>
/// <remarks><para>
/// 対象コントロールの 指定されたプロパティに入力値が存在するかの
/// 検証を実行します。
/// </para><para>
/// 検証を実行し、結果を IsValid に設定します。問題を検出した場合には
/// エラーメッセージに問題の内容を設定します。
/// </para>
/// </remarks>
public override void Validate()
{
this.IsValid = true;
this.ErrorMessage = string.Empty;
object obj;
if (this.WebControl != null)
obj = this.WebControl.GetType().GetProperty(this.ValuePropertyName).GetValue(this.WebControl, null);
else
obj = this.ValidatorDTO.GetType().GetProperty(this.ValuePropertyName).GetValue(this.ValidatorDTO, null);
if (obj == null)
{
this.IsValid = false;
this.ErrorMessage = "COMMON_E04";
}
else if (obj.GetType() == typeof(bool) && !((bool)obj))
{
this.IsValid = false;
this.ErrorMessage = "COMMON_E04";
}
else if (string.IsNullOrEmpty(obj.ToString()))
{
this.IsValid = false;
this.ErrorMessage = "COMMON_E04";
}
if (this.WebControl != null)
base.SetControlStyle();
}
/// <summary>
/// エラーメッセージ文言を戻します。
/// </summary>
/// <param name="manager">ResourceManager</param>
/// <returns>メッセージ文言</returns>
public override string GetErrorMessage(System.Resources.ResourceManager manager)
{
return string.Format(manager.GetString(this.ErrorMessage), this.UICaption);
}
/// <summary>コンストラクタ。</summary>
/// <param name="webControl">検証対象 DTOへの参照</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <param name="valuePropertyName">検証対象 Web コントロールの値を取得するプロパティ名</param>
/// <remarks></remarks>
public RequiredValidator(IValidatorDTO validatorDto, string uiCaption, string valuePropertyName)
: base(validatorDto, uiCaption, valuePropertyName) { }
/// <summary>コンストラクタ。</summary>
/// <param name="control">コントロール</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <param name="valuePropertyName">検証対象 Web コントロールの値を取得するプロパティ名</param>
/// <remarks></remarks>
public RequiredValidator(Control control, string uiCaption, string valuePropertyName)
: base(control, uiCaption, valuePropertyName) {}
/// <summary>コンストラクタ。</summary>
/// <param name="control">コントロール</param>
/// <param name="uiCaption">UI で特に指定された項目名(キャプション)</param>
/// <remarks></remarks>
public RequiredValidator(Control control, string uiCaption)
: base(control, uiCaption) {}
/// <summary>コンストラクタ。</summary>
/// <param name="control">コントロール</param>
/// <remarks></remarks>
public RequiredValidator(Control control)
: base(control) {}
}