Asp.net后台循环取页面控件中的数据

最近的项目中,因为页面有很多textbox需要取值,而且有些数据需要判断是否为空,还需要做正则校验,如果是单个单个的取感觉就很麻烦,所以就想要循环获取控件,再来根据控件中的属性来判断是否需要判断非空、正则校验以及输出异常。

首先是前台

<table runat="server" id="table"> 
<tr>
<td>
      <span>*</span>联系方式
 </td>
  <td>
        <!--我这里是使用的html中data属性来定义的一些需要用到的值-->
<!--比如数据库对应的栏位,正则表达式,描述,和正则校验没有匹配时输出的异常信息-->
       <asp:TextBox runat="server" ID="tb_tel" CssClass="form-control"
 data-column="PHONENO" data-reg="^1[345789]\d{9}$" 
data-regException="手机号码格式不正确" data-desc="联系方式"
         placeholder="请输入11位手机号码"/>
  </td>
</tr>
</table>

后台用的是递归,并使用Dictionary来存储获取到的值

// <summary>
    /// 循环获取textbox和ddl的值
    /// 适用于控件多的时候
    /// </summary>
    /// <param name="control"></param>
    public Dictionary<string, object> GetControl(Control control, Dictionary<string, object> dic) {
        //Dictionary<string, object> dic = new Dictionary<string, object>();
        foreach (Control c in control.Controls) {
            if (control.HasControls()) {
                GetControl(c,dic);
            }
            if (c is TextBox) {
                //如果是textbox
                //先判断是否有输入
                //再判断是否有data-reg属性
                //如果有则使用正则表达式进行判断
                //将数据添加到dictionary
                TextBox text = (TextBox)c;
                string column = text.Attributes["data-column"];
                object value = TextBoxOperate(text);
                dic.Add(column, value);
            }
            else if (c is DropDownList) {
                DropDownList ddl = (DropDownList)c;
                string column = ddl.Attributes["data-column"];
                string value = ddl.SelectedValue;
                dic.Add(column, value);
            }
        }
        return dic;
    }

 private object TextBoxOperate(TextBox tb) {
        string value = tb.Text.Trim();
        //如果数据为空并且不允许为空的时候则抛出错误。页面中的控件如果没有data-allowNull的则表示默认不能为空
        if (string.IsNullOrEmpty(value) && !tb.Attributes["data-allowNull"].Equals("Y"))
            throw new ArgumentNullException(tb.Attributes["data-desc"] + "不能为空");
        //正则校验        
        if (tb.Attributes["data-reg"] != null) {
            string reg = tb.Attributes["data-reg"];
            if (!CheckDataByRegex.CheckData(reg, value)) {
                throw new FormatException(tb.Attributes["data-regException"]);
            }
        }
        //根据实际情况来转换数据类型
        string type = tb.Attributes["data-type"];
        return ConvertValue(type, value);
    }
    
     /// <summary>
    /// 通过正则表达式验证数据
    /// </summary>
    /// <param name="regStr"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool CheckData(string regStr,string value) {
        //如果正则表达式是空的,则直接返回true
        if (string.IsNullOrEmpty(regStr))
            return true;
        Regex reg = new Regex(regStr);
        return reg.IsMatch(value);
    }

/// <summary>
    /// 根据类型转换数据
    /// </summary>
    /// <param name="type"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    private object ConvertValue(string type, string value) {
        object res = new object();
        switch (type) {
            case "int":
                res = int.Parse(value);
                break;
            case "decimal":
                res = decimal.Parse(value);
                break;
            case "date":
                res = DateTime.Parse(value);
                break;
            case null:
            case "string":
            default:
                res = value;
                break;
        }
        return res;
    }

good good study,day day up!有错误和不足的地方,还请指出来,我好修改,三克油

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章