在上一篇《EXT.NET高效开发(一)——概述》中,大致的介绍了一下EXT.NET。那么本篇就要继续完成未完成的事业了。说到高效开发,那就是八仙过海各显神通。比如使用代码生成器,这点大家可以参考我的这篇帖子《CodeSmith系列(三)——使用CodeSmith生成ASP.NET页面》。本人是比较推崇批量化生产的。当然,本篇的重点不在这,看过标题的人都知道。
在使用EXT.NET的时候(当然不仅仅是EXT.NET),总是要做很多重复的事,于是封装一些实用的函数可以一劳永逸呀。
1)单选框和复选框.
看图说话开始了,如图
当选择其他的时候,出框框填写数据。在实际需求中,很多选择项都不是只有A、B、C、D,往往还能自己自定义。遇到这种需求的,每次加个框框跟后面既麻烦又不方便布局,于是秉着不重复造轮子的原则,定义了以下函数:
/// <summary> /// 绑定单选框组(最后一项为可编辑项,保持位置为ID+Hidden) /// </summary> /// <typeparam name="T">类类型</typeparam> /// <param name="lst">泛型集合</param> /// <param name="ID">复选框组ID</param> /// <param name="TextPropertyName">需要绑定的文本属性字段名(大写小都必须一致)</param> /// <param name="ValuePropertyName">需要绑定的值属性字段名(大写小都必须一致)</param> /// <param name="CheckedPropertyName">需要绑定的选择属性字段名(大写小都必须一致)</param> /// <param name="isCheckedPropertyName">是否是选择属性字段名,如果如false,则CheckedPropertyName表示选中的值</param> /// <param name="_ColumnsNumber">显示列数</param> /// <param name="_remark">备注项名称,如设置了此项,则可以填写该项备注</param> /// <param name="textlen">显示的文本长度</param> public static void BindRadioGroup<T>(System.Web.UI.UserControl _userControl, List<T> lst, string ID, string TextPropertyName, string ValuePropertyName, string CheckedPropertyName, bool isCheckedPropertyName, int? _ColumnsNumber, string _remark, int textlen) { if (lst != null && lst.Count > 0) { Control _control = _userControl.FindControl(ID); if (_control is RadioGroup) { //该脚本实现弹框填写其他项,以下是参数 //hiddenID:其他项的文本保存位置ID //chk:其他项的CheckBox //orgBoxLabel:原始的BoxLabel string _setRemarkScript = @" function setChkRemark(hiddenID, chk, orgBoxLabel ,textlen) { if (chk.getValue()) { Ext.MessageBox.show({ title: orgBoxLabel, msg: '请输入' + orgBoxLabel + ':', width: 300, buttons: Ext.MessageBox.OKCANCEL, multiline: true, value: hiddenID.getValue(), fn: function (btn, text) { var remark = text.replace(/(^\s*)|(\s*$)/g, ''); if (btn == 'cancel') Ext.MessageBox.alert('温馨提示', '操作已取消。'); else if (btn == 'ok') { hiddenID.setValue(remark); if (remark!='') chk.setBoxLabel(orgBoxLabel+':'+(remark.length>textlen? remark.toString().substring(0,textlen)+'...':remark)); else chk.setBoxLabel(orgBoxLabel); } } }); } } "; //注册函数 _userControl.Page.ClientScript.RegisterStartupScript(_userControl.GetType(), "setChkRemark", _setRemarkScript, true); RadioGroup groupRadios = _control as RadioGroup; if (groupRadios == null) return; //groupRadios.SubmitValue = true; #region 【_ColumnsNumber】设置显示列数,为null则一行显示4列。 _ColumnsNumber = _ColumnsNumber ?? 4; if (lst.Count <= _ColumnsNumber) { groupRadios.ColumnsNumber = lst.Count; } else { groupRadios.ColumnsNumber = _ColumnsNumber.Value; } #endregion groupRadios.Items.Clear(); int i = 0; foreach (var item in lst) { T t = item; Type type = t.GetType(); Radio rdo = new Radio(); rdo.ID = string.Format("{0}items{1}", ID, i); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); object objText = TextProInfo.GetValue(t, null); rdo.BoxLabel = objText == null ? string.Empty : objText.ToString(); object objValue = ValueProInfo.GetValue(t, null).ToString(); rdo.Tag = objValue == null ? string.Empty : objValue.ToString(); rdo.InputValue = objValue == null ? string.Empty : objValue.ToString(); if (!isCheckedPropertyName) { if (rdo.Tag == CheckedPropertyName) rdo.Checked = true; groupRadios.Items.Add(rdo); i++; continue; } PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); if ((CheckedProInfo.GetValue(t, null) ?? 0).ToString() == "1") rdo.Checked = true; groupRadios.Items.Add(rdo); i++; } groupRadios.Items[groupRadios.Items.Count - 1].Listeners.Check.Handler = "setChkRemark(#{" + ID + "Hidden},this,'" + _remark + "'," + textlen + ");"; } else if (_control is System.Web.UI.WebControls.RadioButtonList) { System.Web.UI.WebControls.RadioButtonList _rbl = _control as System.Web.UI.WebControls.RadioButtonList; _rbl.DataTextField = TextPropertyName; _rbl.DataValueField = ValuePropertyName; _rbl.DataSource = lst; _rbl.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Horizontal; //_rbl.RepeatLayout = RepeatLayout.Flow; _rbl.DataBind(); if (!isCheckedPropertyName) _rbl.SelectedValue = CheckedPropertyName; } } }
这样调用起来就方便了,如:
ExtControlHelper.BindCheckGroup(this, _db.SelectGeneralFromTableINFO(ShopID, CurrentFormID, "TerminationReason").ToList() , "cblTerminationReason", "AttributeValue", "AttributeID", "CheckValue", 4, "其他", 8);
不过别忘了在页面上丢一个“<ext:Hidden ID="cblTerminationReasonHidden" runat="server" />”。
为了方便,本人又定义了以下几个函数:
/// <summary> /// 绑定单选框组 /// </summary> /// <typeparam name="T">类类型</typeparam> /// <param name="lst">泛型集合</param> /// <param name="ID">复选框组ID</param> /// <param name="TextPropertyName">需要绑定的文本属性字段名(大写小都必须一致)</param> /// <param name="ValuePropertyName">需要绑定的值属性字段名(大写小都必须一致)</param> /// <param name="CheckedPropertyName">需要绑定的选择属性字段名(大写小都必须一致)</param> /// <param name="isCheckedPropertyName">是否是选择属性字段名,如果如false,则CheckedPropertyName表示选中的值</param> /// <param name="_ColumnsNumber">显示列数</param> public static void BindRadioGroup<T>(System.Web.UI.UserControl _userControl, List<T> lst, string ID, string TextPropertyName, string ValuePropertyName, string CheckedPropertyName, bool isCheckedPropertyName, int? _ColumnsNumber) { if (lst != null && lst.Count > 0) { Control _control = _userControl.FindControl(ID); if (_control is RadioGroup) { RadioGroup groupRadios = _control as RadioGroup; if (groupRadios == null) return; #region 【_ColumnsNumber】设置显示列数,为null则一行显示4列。 _ColumnsNumber = _ColumnsNumber ?? 4; if (lst.Count <= _ColumnsNumber) { groupRadios.ColumnsNumber = lst.Count; } else { groupRadios.ColumnsNumber = _ColumnsNumber.Value; } #endregion groupRadios.Items.Clear(); int i = 0; foreach (var item in lst) { T t = item; Type type = t.GetType(); Radio rdo = new Radio(); rdo.ID = string.Format("{0}items{1}", ID, i); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); object objText = TextProInfo.GetValue(t, null); rdo.BoxLabel = objText == null ? string.Empty : objText.ToString(); object objValue = ValueProInfo.GetValue(t, null).ToString(); rdo.Tag = objValue == null ? string.Empty : objValue.ToString(); rdo.InputValue = objValue == null ? string.Empty : objValue.ToString(); if (!isCheckedPropertyName) { if (rdo.Tag == CheckedPropertyName) rdo.Checked = true; groupRadios.Items.Add(rdo); i++; continue; } PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); if ((CheckedProInfo.GetValue(t, null) ?? 0).ToString() == "1") rdo.Checked = true; groupRadios.Items.Add(rdo); i++; } } else if (_control is System.Web.UI.WebControls.RadioButtonList) { System.Web.UI.WebControls.RadioButtonList _rbl = _control as System.Web.UI.WebControls.RadioButtonList; _rbl.DataTextField = TextPropertyName; _rbl.DataValueField = ValuePropertyName; _rbl.DataSource = lst; _rbl.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Horizontal; //_rbl.RepeatLayout = RepeatLayout.Flow; _rbl.DataBind(); if (!isCheckedPropertyName) _rbl.SelectedValue = CheckedPropertyName; } } } /// <summary> /// 绑定复选框组 /// </summary> /// <typeparam name="T">类类型</typeparam> /// <param name="lst">泛型集合</param> /// <param name="ID">复选框组ID</param> /// <param name="TextPropertyName">需要绑定的文本属性字段名(大写小都必须一致)</param> /// <param name="ValuePropertyName">需要绑定的值属性字段名(大写小都必须一致)</param> /// <param name="CheckedPropertyName">需要绑定的选择属性字段名(大写小都必须一致)</param> public static void BindCheckGroup<T>(Control _userControl, List<T> lst, string ID, string TextPropertyName, string ValuePropertyName, string CheckedPropertyName, int? _ColumnsNumber) { if (lst != null && lst.Count > 0) { Control _control = _userControl.FindControl(ID); if (_control is CheckboxGroup) { CheckboxGroup groupChks = _control as CheckboxGroup; if (groupChks == null) return; #region 【_ColumnsNumber】设置显示列数,为null则一行显示4列。 _ColumnsNumber = _ColumnsNumber ?? 4; if (lst.Count <= _ColumnsNumber) { groupChks.ColumnsNumber = lst.Count; } else { groupChks.ColumnsNumber = _ColumnsNumber.Value; } #endregion groupChks.Items.Clear(); int i = 0; foreach (var item in lst) { T t = item; Type type = t.GetType(); Checkbox chk = new Checkbox(); chk.ID = string.Format("{0}items{1}", ID, i); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); object objText = TextProInfo.GetValue(t, null); chk.BoxLabel = objText == null ? string.Empty : objText.ToString(); object objValue = ValueProInfo.GetValue(t, null).ToString(); chk.Tag = objValue == null ? string.Empty : objValue.ToString(); chk.InputValue = chk.Tag; //chk.InputValue = objValue == null ? string.Empty : objValue.ToString(); var _checkValue = (CheckedProInfo.GetValue(t, null) ?? 0).ToString(); if (_checkValue == "1" || (_checkValue != null && _checkValue.ToLower() == "true")) chk.Checked = true; groupChks.Items.Add(chk); i++; } } else if (_control is System.Web.UI.WebControls.CheckBoxList) { System.Web.UI.WebControls.CheckBoxList _cbl = _control as System.Web.UI.WebControls.CheckBoxList; _cbl.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Horizontal; _cbl.RepeatLayout = System.Web.UI.WebControls.RepeatLayout.Table; _cbl.RepeatColumns = 7; _cbl.Width = System.Web.UI.WebControls.Unit.Parse("100%"); foreach (var item in lst) { T t = item; Type type = t.GetType(); Checkbox chk = new Checkbox(); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); object objText = TextProInfo.GetValue(t, null); object objValue = ValueProInfo.GetValue(t, null).ToString(); System.Web.UI.WebControls.ListItem _li = new System.Web.UI.WebControls.ListItem(); _li.Text = objText == null ? string.Empty : objText.ToString(); _li.Value = objValue == null ? string.Empty : objValue.ToString(); var _checkValue = CheckedProInfo.GetValue(t, null).ToString(); if (_checkValue == "1" || (_checkValue != null && _checkValue.ToLower() == "true")) _li.Selected = true; _cbl.Items.Add(_li); } } } } /// <summary> /// 绑定复选框组(最后一项为可编辑项,保持位置为ID+Hidden) /// </summary> /// <typeparam name="T">类类型</typeparam> /// <param name="lst">泛型集合</param> /// <param name="ID">复选框组ID</param> /// <param name="TextPropertyName">需要绑定的文本属性字段名(大写小都必须一致)</param> /// <param name="ValuePropertyName">需要绑定的值属性字段名(大写小都必须一致)</param> /// <param name="CheckedPropertyName">需要绑定的选择属性字段名(大写小都必须一致)</param> /// <param name="_ColumnsNumber">显示列数</param> /// <param name="_remark">备注项名称,如设置了此项,则可以填写该项备注</param> /// <param name="textlen">显示的文本长度</param> public static void BindCheckGroup<T>(Control _userControl, List<T> lst, string ID, string TextPropertyName, string ValuePropertyName, string CheckedPropertyName, int? _ColumnsNumber, string _remark, int textlen) { if (lst != null && lst.Count > 0) { Control _control = _userControl.FindControl(ID); if (_control is CheckboxGroup) { ToolTip _tool=new ToolTip(); _tool.ID = string.Format("{0}ToolTip", ID); //该脚本实现弹框填写其他项,以下是参数 //hiddenID:其他项的文本保存位置ID //chk:其他项的CheckBox //orgBoxLabel:原始的BoxLabel string _setRemarkScript = @" function setChkRemark(hiddenID, chk, orgBoxLabel ,textlen) { if (chk.getValue()) { Ext.MessageBox.show({ title: orgBoxLabel, msg: '请输入' + orgBoxLabel + ':', width: 300, buttons: Ext.MessageBox.OKCANCEL, multiline: true, value: hiddenID.getValue(), fn: function (btn, text) { var remark = text.replace(/(^\s*)|(\s*$)/g, ''); if (btn == 'cancel') Ext.MessageBox.alert('温馨提示', '操作已取消。'); else if (btn == 'ok') { hiddenID.setValue(remark); if (remark!='') chk.setBoxLabel(orgBoxLabel+':'+(remark.length>textlen? remark.toString().substring(0,textlen)+'...':remark)); else chk.setBoxLabel(orgBoxLabel); } } }); } } "; //注册函数 _userControl.Page.ClientScript.RegisterStartupScript(_userControl.GetType(), "setChkRemark", _setRemarkScript, true); CheckboxGroup groupChks = _control as CheckboxGroup; if (groupChks == null) return; #region 【_ColumnsNumber】设置显示列数,为null则一行显示4列。 _ColumnsNumber = _ColumnsNumber ?? 4; if (lst.Count <= _ColumnsNumber) { groupChks.ColumnsNumber = lst.Count; } else { groupChks.ColumnsNumber = _ColumnsNumber.Value; } #endregion groupChks.Items.Clear(); int i = 0; foreach (var item in lst) { T t = item; Type type = t.GetType(); Checkbox chk = new Checkbox(); chk.ID = string.Format("{0}items{1}", ID, i); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); object objText = TextProInfo.GetValue(t, null); chk.BoxLabel = objText == null ? string.Empty : objText.ToString(); chk.ToolTip = objText == null ? string.Empty : objText.ToString(); object objValue = ValueProInfo.GetValue(t, null).ToString(); chk.Tag = objValue == null ? string.Empty : objValue.ToString(); chk.InputValue = chk.Tag; //chk.InputValue = objValue == null ? string.Empty : objValue.ToString(); var _checkValue = (CheckedProInfo.GetValue(t, null) ?? 0).ToString(); if (_checkValue == "1" || (_checkValue != null && _checkValue.ToLower() == "true")) chk.Checked = true; //if (i == lst.Count - 1) //{ // chk.Listeners.Check.Handler = "setChkRemark(#{" + ID + "Hidden},this,'" + _remark + "'," + textlen + ");"; // //chk.Icons.Add(Icon.Note); //} groupChks.Items.Add(chk); i++; } groupChks.Items[groupChks.Items.Count - 1].Listeners.Check.Handler = string.Format("setChkRemark(#{{{0}Hidden}},this,'{1}',{2});", ID, _remark, textlen); //groupChks.Items[groupChks.Items.Count - 1].ToolTip= } else if (_control is System.Web.UI.WebControls.CheckBoxList) { System.Web.UI.WebControls.CheckBoxList _cbl = _control as System.Web.UI.WebControls.CheckBoxList; _cbl.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Horizontal; _cbl.RepeatLayout = System.Web.UI.WebControls.RepeatLayout.Table; _cbl.RepeatColumns = 7; _cbl.Width = System.Web.UI.WebControls.Unit.Parse("100%"); foreach (var item in lst) { T t = item; Type type = t.GetType(); Checkbox chk = new Checkbox(); PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); PropertyInfo CheckedProInfo = type.GetProperty(CheckedPropertyName); if (CheckedProInfo == null) ExtensionMethods.ThrowNullException(type, CheckedPropertyName); object objText = TextProInfo.GetValue(t, null); object objValue = ValueProInfo.GetValue(t, null).ToString(); System.Web.UI.WebControls.ListItem _li = new System.Web.UI.WebControls.ListItem(); _li.Text = objText == null ? string.Empty : objText.ToString(); _li.Value = objValue == null ? string.Empty : objValue.ToString(); var _checkValue = CheckedProInfo.GetValue(t, null).ToString(); if (_checkValue == "1" || (_checkValue != null && _checkValue.ToLower() == "true")) _li.Selected = true; _cbl.Items.Add(_li); } } } }
2)下拉列表。
无图无真相,果断上图。
绑定下拉列表,在这里,本人也封装了以下。如下面代码:
/// <summary> /// 通过反射绑定下拉列表 /// </summary> /// <typeparam name="T">类类型</typeparam> /// <param name="lst">泛型集合</param> /// <param name="ID">下拉列表ID</param> /// <param name="TextPropertyName">文本属性名</param> /// <param name="ValuePropertyName">值属性名</param> /// <param name="_SelectValue">选择的值</param> public static void BindComobox<T>(Control _userControl, List<T> lst, string ID, string TextPropertyName, string ValuePropertyName, string _SelectValue) { if (lst != null && lst.Count > 0) { ComboBox _cbos = _userControl.FindControl(ID) as ComboBox; if (_cbos == null) return; _cbos.Items.Clear(); foreach (var item in lst) { T t = item; Type type = t.GetType(); ListItem _li = new ListItem(); //文本属性 PropertyInfo TextProInfo = type.GetProperty(TextPropertyName); if (TextProInfo == null) ExtensionMethods.ThrowNullException(type, TextPropertyName); //值属性 PropertyInfo ValueProInfo = type.GetProperty(ValuePropertyName); if (ValueProInfo == null) ExtensionMethods.ThrowNullException(type, ValuePropertyName); object objText = TextProInfo.GetValue(t, null); _li.Text = objText == null ? string.Empty : objText.ToString(); object objValue = ValueProInfo.GetValue(t, null).ToString(); _li.Value = objValue == null ? string.Empty : objValue.ToString(); _cbos.Items.Add(_li); } if (!string.IsNullOrEmpty(_SelectValue)) _cbos.SelectedItem.Value = _SelectValue; } }
其实还有一种方式可以绑定,但是本人更喜欢这种。比如通过Store:
_store = new Store { ID = string.Format("_store{0}", Guid.NewGuid().ToString("N")), IDMode = IDMode.Static }; _jsonReader = new JsonReader(); _jsonReader.Fields.Add(new RecordField("text", RecordFieldType.String)); _jsonReader.Fields.Add(new RecordField("value", RecordFieldType.String)); _store.Reader.Add(_jsonReader);
然后再加上自己定义的URL和参数,定义几个参数,封装一下,也可以通用,这里我就不继续写下去了。
3)SharePoint中,给EXT.NET赋权。
这段代码,提供给需要的人吧。当初这问题把我折磨得快疯狂了。还好想到了这么一个解决方案。
/// <summary> /// 给EXT.NET脚本赋予特权 /// </summary> /// <param name="ResManager">ResourceManager</param> public static void BuildAllPrivilegesForExtNET(this ResourceManager ResManager) { if (!X.IsAjaxRequest) { SPSecurity.RunWithElevatedPrivileges( delegate() { ResManager.RenderScripts = ResourceLocationType.Embedded; ResManager.BuildScripts(); ResManager.RenderStyles = ResourceLocationType.Embedded; ResManager.BuildStyles(); } ); } }
4)读取与赋值。
/// <summary> /// 设置类型的属性值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <param name="userControl">用户控件</param> public static void SetValues<T>(this System.Web.UI.Control userControl, T t) { Type type = t.GetType(); if (type.IsClass) { var properties = type.GetProperties(); foreach (var item in properties) { if (item.CanWrite) { System.Web.UI.Control control = userControl.FindControl("txt" + item.Name); if (control != null) { string text = string.Empty; if (control is DateField) { DateField _df = control as DateField; if (_df.IsEmpty) { if (item.PropertyType.IsGenericType && item.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) item.SetValue(t, null, null); //else // item.SetValue(t, System.Data.DbType.DateTime., null); continue; } else text = _df.Text; } if (control is TextFieldBase) text = (control as TextFieldBase).Text.Trim(); if (item.PropertyType.IsEnum) { item.SetValue(t, Enum.ToObject(item.PropertyType, text), null); } else { //判断是否为可为空类型 if (item.PropertyType.IsGenericType && item.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) { if (item.PropertyType.GetGenericArguments()[0].Equals(typeof(DateTime)) && text == "0001/1/1 0:00:00") item.SetValue(t, null, null); else item.SetValue(t, Convert.ChangeType(text, item.PropertyType.GetGenericArguments()[0]), null); } else item.SetValue(t, Convert.ChangeType(text, item.PropertyType), null); } } } } } } /// <summary> /// 设置控件的属性值 /// </summary> /// <typeparam name="T">类型</typeparam> /// <param name="t">类的对象</param> /// <param name="userControl">用户控件</param> public static void SetControlValues<T>(this System.Web.UI.UserControl userControl, T t) { Type type = t.GetType(); if (type.IsClass) { var properties = type.GetProperties(); foreach (var item in properties) { System.Web.UI.Control control = userControl.FindControl("txt" + item.Name); if (control != null) { if (control is TextFieldBase) { TextFieldBase txt = control as TextFieldBase; object obj = item.GetValue(t, null); if (obj != null) txt.Text = obj.ToString(); } else if (control is DisplayField) { DisplayField txt = control as DisplayField; object obj = item.GetValue(t, null); if (obj != null) txt.Text = obj.ToString(); } } } } }
上面的代码进行了可为空类型的判断,这点需要注意。
5)设置通用的表单验证脚本。
该出图的时候还是得出图啊。
首先需要验证的表单页面得挂上这段JS:
var valCss = ''; function showMsg(title, content, cs) { if (valCss != cs) { valCss = cs; Ext.net.Notification.show({ hideFx: { fxName: 'switchOff', args: [{}] }, showFx: { args: [ 'C3DAF9', 1, { duration: 2.0 } ], fxName: 'frame' }, iconCls: cs, closeVisible: true, html: content, title: title + ' ' + new Date().format('g:i:s A') }); } }
然后:
if (!string.IsNullOrEmpty(_fp.Listeners.ClientValidation.Handler)) return; _fp.Listeners.ClientValidation.Handler = @" var isCheckd=valid;var msgs;var msg=''; if(typeof(ValCustomValidator)=='function') { msgs=ValCustomValidator(false,valid); if(typeof(msgs.IsVal)!='undefined') { isCheckd=msgs.IsVal; if(msgs.Message!='') msg='<span style=\'color:red;\'>'+msgs.Message+'</span>'; } else isCheckd=msgs; } if(typeof(#{btnSave})!='undefined' && #{btnSave}!=null)#{btnSave}.setDisabled(!isCheckd); if(typeof(#{btnSumbit1})!='undefined' && #{btnSumbit1}!=null)#{btnSumbit1}.setDisabled(!isCheckd); var valCs=isCheckd ? 'valaccept' : 'valexclamation'; if (msg=='') msg=isCheckd ? '<span style=\'color:green;\'>验证通过,可以提交数据</span>' : '<span style=\'color:red;\'>输入有误,请检查标红的输入项。</span>'; this.getBottomToolbar().setStatus({text :msg, iconCls: valCs});showMsg('温馨提示',msg,valCs); ";
顺便解释一下:
- 支持在页面上写自定义验证函数“ValCustomValidator”。存在与否都不会引发异常。
- 支持页面上防止保存提交按钮,存在与否也没关系。
- 你还可以根据自己的情况自定义。
因为这里是通用的,比如默认给每一个表单使用这个验证脚本。那么如何实现自定义验证呢?先欣赏两幅美图:
然后右下角就来提示了:
这里再贴上具体的JS:
var ids1 = [ "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt100E44D593C054BFD9B13EBFBD9AAA41A", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt124C85DB03BA04EBDBE5055EAC5FACAEC", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt1DF8DD73F58F84492B89D7194D52D947F", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt1ADD45D7F275148769BD0E20013DC25F2"]; var ids2 = ["ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt200E44D593C054BFD9B13EBFBD9AAA41A", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt224C85DB03BA04EBDBE5055EAC5FACAEC", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt2DF8DD73F58F84492B89D7194D52D947F", "ctl00_ctl07_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_g_6fdea0d3_1768_457b_a4ba_ff8b3fc1ea4e_ASP_wpresources_usercontrols_form_packagenotice_ascx_txt2ADD45D7F275148769BD0E20013DC25F2"]; function valSumMax(ids, maxValue, msg) { if (ids != null && ids.length > 0) { var _temp = 0; for (var i = 0; i < ids.length; i++) { var value = Ext.getCmp(ids[i]).getValue(); var _currentValue = parseInt(value); _temp += isNaN(_currentValue) ? 0 : _currentValue; if (_temp > maxValue) { var message = { 'IsVal': false, 'Message': msg != "" ? msg : ("当前值" + _temp + "超过最大值" + maxValue + "。") }; return message; } } } var message = { 'IsVal': true, 'Message': '' }; return message; } function CustomValidator() { var msg = valSumMax(ids1, 2, "美容顾问服装最多只能填2件。请修改总数。"); if (!msg.IsVal) return msg; msg = valSumMax(ids2, 6, "美容师服装最多只能填6件。请修改总数。"); return msg; } function ValCustomValidator(isVal, valid) { if (typeof (valid) != 'undefined' && (!valid)) return valid; if (typeof (isVal) == 'undefined' || isVal == null || isVal) { var msg = CustomValidator(); if (!msg.IsVal) { Ext.MessageBox.show({ title: '错误', msg: msg.Message, buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.ERROR }); return false; } else { return true; } } else { return CustomValidator(); } }
看到上面那一串ID没,这就是不使用IDMode的后果。因为刚开始接触,未发现有这么个好东东。
好了,今天就到此为止吧,我们还会见面的。我上面用了一些反射,大家都说反射性能怎么样怎么样,但是这点消耗有时大可不必担心,不过有些还是可以优化的,比如绑定下拉列表,使用Store结合HttpProxy的话,就完全不需要用反射了。只是每次绑定的时候,代码里面要调用下,然后Httphandler类也要写点代码。
当然我封装的并不止这一些,但是只适合我自己的系统,就不方便拿出来了。
兄弟我先抛块砖,有玉的赶紧砸过来吧。