码迷,mamicode.com
首页 > Web开发 > 详细

[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator

时间:2019-09-16 13:40:48      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:href   mat   oval   lsp   结果   new   极速   padding   prope   

[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator


前言

原理同之前设计在Custom Control里面一样,请参考:TextBox动态加入RequiredFieldValidator与CustomValidator

只是这边是运用在User Control里面,因为User Control组合的弹性更大,
顺手写个范例给开发的team member作个参考,也希望各位前辈不吝赐教。

介绍

这边的User Control仍为之前范例上,有两个TextBox,一个为ID,一个为Name。

需求:

  1. 要有property可以存取CodeID与CodeName的值
  2. 要有property可以控制CodeID与CodeName是否为必要输入项
  3. 要能与外界ValidationGroup一起运行
  4. 错误消息要能读取Resource档,且与外界交互(例如:XXX 代码 不可空白,XXX要能给外面设定)
  5. PostBack与多个User Control要能正常运行

接着让我们看下去…

Play it

aspx上,要有两个TextBox,分别为txtID与txtName。





针对第一个需求与第二个需求,我们开四个属性出来,
特别要注意的是,Required的属性要使用ViewState记,不然PostBack会掉。


    /// Gets or sets the code ID.
    /// 
    /// The code ID.
    public string CodeID {
        get { return this.txtID.Text; }
        set { this.txtID.Text = value; } 
    }

    /// 
    /// Gets or sets a value indicating whether [code ID required].
    /// 
    /// true if [code ID required]; otherwise, false.
    public bool CodeIDRequired {
        get {
            return (bool)(this.ViewState["CodeIDRequired"]??false); 
        }
        set { this.ViewState["CodeIDRequired"] = value; }
    }

    /// 
    /// Gets or sets the name of the code.
    /// 
    /// The name of the code.
    public string CodeName
    {
        get { return this.txtName.Text; }
        set { this.txtName.Text = value; } 
    }

    /// 
    /// Gets or sets a value indicating whether [code name required].
    /// 
    /// true if [code name required]; otherwise, false.
    public bool CodeNameRequired {
        get { return (bool)(this.ViewState["CodeNameRequired"]??false); }
        set { this.ViewState["CodeNameRequired"] = value; }
    }

根据第三个需求与第四个需求,我们要开ValidationGroup的属性与一个供外界设定错误消息的属性。


    /// Gets or sets the mapping label text.
    /// 
    /// The mapping label.
    public string MappingLabel { get; set; }

    /// 
    /// Gets or sets the validation group.
    /// 
    /// The validation group.
    public string ValidationGroup
    {
        get { return this.txtID.ValidationGroup; }
        set {
            this.txtID.ValidationGroup = value;
            this.txtName.ValidationGroup = value;
        } 
    }

要读取Resource档的消息代码,我这边写在BasePage,并且声明成static。


{
	public BasePage()
	{
		//
		// TODO: 在此加入建构函数的程序
		//
	}
    /// 
    /// Getmessages the specified Message id.
    /// 
    /// The Message id.
    /// 
    public static string GetMessage(string MsgId)
    {
        return Resources.Message.ResourceManager.GetString(MsgId);
    }
}

Message则是长这样:

技术图片

最后,
我们要在User Control的Page_PreRender事件,判断Required属性,是否为True,再决定是否要动态加入RequiredFieldValidator。


    {
        if (this.CodeIDRequired)
        {
            RequiredFieldValidator codeIDRequiredValidator = new RequiredFieldValidator();
            codeIDRequiredValidator.Display = ValidatorDisplay.None;
            codeIDRequiredValidator.ValidationGroup = this.ValidationGroup;
            codeIDRequiredValidator.ControlToValidate = this.txtID.ID;
            //这边是结合Resource的Message档,搭配string.Format,可以结合更多的应用
            //在这里,10400代表‘字段不可空白’
            codeIDRequiredValidator.ErrorMessage = string.Format(BasePage.GetMessage("10400"), MappingLabel + "代码");
            this.Controls.Add(codeIDRequiredValidator);
        }

        if (this.CodeNameRequired)
        {
            RequiredFieldValidator codeNameRequiredValidator = new RequiredFieldValidator();
            codeNameRequiredValidator.Display = ValidatorDisplay.None;
            codeNameRequiredValidator.ValidationGroup = this.ValidationGroup;
            codeNameRequiredValidator.ControlToValidate = this.txtName.ID;
            //这边是结合Resource的Message档,搭配string.Format,可以结合更多的应用
            //在这里,10400代表‘字段不可空白’
            codeNameRequiredValidator.ErrorMessage = string.Format(BasePage.GetMessage("10400"), MappingLabel+"姓名");
            this.Controls.Add(codeNameRequiredValidator);
        }
    }


最后来看看结果:

技术图片

结论

这个范例可以练习到

  1. User Control属性的开立
  2. ViewState的应用
  3. 动态加入验证控件
  4. 读取消息档方法的共用
  5. 让User Control的验证消息可以读消息档,也可以跟外界交互

最后成功的把Required,封装在User Control里面,让使用的人只需要设定一个属性就可以搞定。


把相关文件Sample Code附上来,可以玩玩看测试的页面,有问题欢迎反应给我,谢谢。

Sample Code:UserControlRequired.zip

[注1]:2009/12/24,属性若使用ViewState,请自行判断是否为null,若是,则给默认值(例如false或string.empty),
否则可能出现Null exception。已将判断补上文章上sample code


或许您会对下列培训课程感兴趣:

  1. 2019/7/27(六)~2019/7/28(日):演化式设计:测试驱动开发与持续重构 第六梯次(中国台北)
  2. 2019/8/16(五)~2019/8/18(日):【C#进阶设计-从重构学会高易用性与高弹性API设计】第二梯次(中国台北)
  3. 2019/9/21(六)~2019/9/22(日):Clean Coder:DI 与 AOP 进阶实战 第二梯次(中国台北)
  4. 2019/10/19(六):【针对遗留代码加入单元测试的艺术】第七梯次(中国台北)
  5. 2019/10/20(日):【极速开发】第八梯次(中国台北)
技术图片

想收到第一手公开培训课程资讯,或想询问企业内训、顾问、教练、咨询服务的,请洽 Facebook 粉丝专页:91敏捷开发之路。

原文:大专栏  [ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator


[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator

标签:href   mat   oval   lsp   结果   new   极速   padding   prope   

原文地址:https://www.cnblogs.com/petewell/p/11526732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!