[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

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

时间: 2024-08-30 06:46:07

[ASP.NET]UserControl透过属性,动态加入RequiredFieldValidator的相关文章

在ASP.NET程序中用程序动态向<head>便签里添加<meta>标签

在使用ASP.NET框架开发: 若要在Html网页中加入<meta>设置,但想通过程序动态加入: 1.如果是ASP.NET4.0以前版本: 使用HtmlMeta类加入<meta>设置: //首先我们应该创立HtmlMeta类实体(命名空间:System.Web.UI.HtmlControls) HtmlMeta meta1=new HtmlMeta(); meta1.Name="keyword"; meta1.Content="ASP.NET,jQue

ASP.NET控件属性大全

ASP.NET控件属性大全 DataGridView 控件DataGridView 控件提供用来显示数据的可自定义表.使用 DataGridView 类,可以自定义单元格.行.列和边框. 注意DataGridView 控件提供 DataGrid 控件所不具备的许多基本和高级功能.有关更多信息,请参见 Windows 窗体 DataGridView 控件和 DataGrid 控件之间的区别 常用属性:DefaultCellStyle.ColumnHeadersDefaultCellStyle.Ce

[转]ASP.NET自定义控件复杂属性声明持久性浅析

在自定义控件的开发过程中,我们经常要给控件添加一些复杂类型的属性.利用声明持久性(Declarative Persistence)可使得页面开发人员能够让页面开发人员在ASP.NET页面中,声明性地设置这些复杂属性值,而无需编写任何C#或者VB.NET代码. 参见下面的例子: GridView的DataKeyNames属性,其数据类型是string[]: <asp:GridView ID="GridView1" runat="server" DataKeyNa

[ASP.NET] 如何透过 HTTP Handler 让 Web 项目中的图片 Response 时加上指定的文字(转)

这两天在网络上逛街的时候, 看到"Topcat"的一篇文章 "如何透过 HTTP Handler 让 Web 项目中的图案(JPG)Response时加上指定的文字" 因为之前大多都另外使用 ashx 文件刷新图片, 输出时在使用者网页上看到的连结也大多会是 *.ashx,看久了总觉得很怪╰(‵□′)╯ 还好有看到这篇文章,在此先谢谢 Cat 大大- 以下,转录自"topcat 姗舞之间的极度凝聚" 另外,请 Cat 大大恕我修改了 小-小-小-

java 反射 根据属性 动态设置值

package com.jhl.jvm.lesson8; import java.lang.reflect.Field; /** * * @author jhl * java 反射 根据属性 动态设置值 demo * */ public class ExceptionLog { private String exceptionLogId; private String processingType; private String type; private String content; pub

【翻译】ASP.NET MVC 5属性路由

原文链接:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#why-attribute-routing 最近在学习MVC相关的东西,今天刚好到msdn上看到了这样的一片文章,感觉不错,于是决定将它翻译出来和博友们一起分享下.我第一次发表文章,有不对的地方非常欢迎指出. —— 写在前面 废话不多说了,咱们开始吧 路由是ASP.NET MVC 怎样去用一个URI去匹配一个

来篇文章:ASP。NET程序中动态修改web.config中的设置项目 (后台CS代码)

朋友们可以自行测试,我这里都没有问题了,鳖了一上午的问题总算解决了 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; usi

ASP.NET中IsPostBack属性研究

通过页面的IsPostback属性,可以检查 .aspx 页是否为传递回服务器的页面:当加载页面并对控件的更改属性处理之前,用户可以在page_Load事件中检查该页面是否被传递回的页面. 一般是在page_load中检查是否是第一次加载本页或是判断是否是用户提交(PostBack)if (!IsPostBack) {//do something}在用DataGrid访问和更新数据库时没有注意到这个问题,会出现各种各样的奇怪问题,比如我的这种. 问题描述:用DataGrid访问和更新数据库(SQ

ASP.NET MVC模块化开发——动态挂载外部项目

原文:ASP.NET MVC模块化开发--动态挂载外部项目 最近在开发一个MVC框架,开发过程中考虑到以后开发依托于框架的项目,为了框架的维护更新升级,代码肯定要和具体的业务工程分割开来,所以需要解决业务工程挂载在框架工程的问题,MVC与传统的ASP.NET不同,WebForm项目只需要挂在虚拟目录拷贝dll就可以访问,但是MVC不可能去引用工程项目的dll重新编译,从而产生了开发一个动态挂在MVC项目功能的想法,MVC项目挂载主要有几个问题,接下来进行详细的分析与完成解决方案 一般动态加载dl