最近的项目中,因为页面有很多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!有错误和不足的地方,还请指出来,我好修改,三克油