asp.netサーバー側項目チェックの案


    /// <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) {}
    }

转载于:https://my.oschina.net/cjkall/blog/195891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值