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

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator相关的知识,希望对你有一定的参考价值。

[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的主要内容,如果未能解决你的问题,请参考以下文章

将 UserControl 属性设置为不显示在 VS 属性窗口中

在 asp.net 中,如何从 usercontrol 获取自定义 webcontrol 的引用?

如何在 UserControl (.ascx) 中调用 ASP.NET WebMethod

ASP.NET UserControl 和 DefaultEvent

将 Asp.Net UserControl 用作 SharePoint WebPart

ASP.net UserControl 和 AppDomain TypeResolve