Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1034456
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-03-26 17:35:43

所谓磨刀不误砍柴工,先写点通用的代码,后面开发起来效率就高多了。多余的话就不敲了,先简单介绍介绍吧。

时间格式化

对于序列化JSON,我喜欢用JSON.NET,为了方便,我定义了一个扩展方法,如下面代码:

1: /// 2: /// 将对象序列化为JSON数据 3: /// 4: /// 5: /// 6: public static string ToJson(this object instance) 7: { 8: return JsonConvert.SerializeObject(instance); 9: }

那么序列化JOSN输出那么就方便多了,如下面代码:

1: var info = from a in db.TB_KTVAndConcert 2: join b in db.TB_City on a.Cityid equals b.ID 3: where a.AttributeCode == "AttrubuteCode".GetRequest() 4: orderby a.Cityid 5: select new 6: { 7: a.CreateDate, 8: a.Defaultflag, 9: a.ID, 10: a.Name, 11: a.Cityid, 12: b.CityName, 13: a.Displayindex 14: }; 15: if ("CityID".GetRequest().IsNotEmpty()) 16: { 17: if (MyRegex.IsNumberRegex("CityID".GetRequest())) 18: { 19: int cityId = Convert.ToInt32("CityID".GetRequest()); 20: info = info.Where(p => p.Cityid == cityId); 21: } 22: } 23: context.Response.Write(info.OrderByDescending(p => p.Defaultflag).ThenBy(p => p.Displayindex).ToJson());

序列化JSON是可以了,但是前台显示DateTime类型数据时显示就有问题了,也就是获取不到想要的格式化字符串。解决这个问题有两种方式,方式一就是定义一个C#方法来返回格式化时间字符串,关键部分代码如下:

1: select new 2: { 3: CreateDate = a.CreateDate.GetDateTimeString(), 4: a.Defaultflag, 5: a.ID, 6: a.Name, 7: a.Cityid, 8: b.CityName, 9: a.Displayindex 10: };

这样虽然可以,但是如果我想统一在浏览器端处理呢?于是封装下面的函数:

1: //时间格式化 2: Date.prototype.format = function (format) { 3: if (!format) { 4: format = "yyyy-MM-dd hh:mm:ss"; 5: } 6: var o = { 7: "M+": this.getMonth() + 1, // month 8: "d+": this.getDate(), // day 9: "h+": this.getHours(), // hour 10: "m+": this.getMinutes(), // minute 11: "s+": this.getSeconds(), // second 12: "q+": Math.floor((this.getMonth() + 3) / 3), // quarter 13: "S": this.getMilliseconds() 14: // millisecond 15: }; 16: if (/(y+)/.test(format)) { 17: format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 18: } 19: for (var k in o) { 20: if (new RegExp("(" + k + ")").test(format)) { 21: format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); 22: } 23: } 24: return format; 25: }; 26: function fomatDate(str) { 27: return (new Date(parseInt(str.substring(str.indexOf('(') + 1, str.indexOf(')'))))).format("yyyy-MM-dd hh:mm:ss"); 28: }

前台调用:

1: function formatCreateDate(value, row, index) { 2: 3: return fomatDate(row.CreateDate); 4: 5: }

显示效果:

image

消息框 弹出框以及系统消息框
1: function showMsg(title, msg, isAlert) { 2: if (isAlert !== undefined && isAlert) { 3: $.messager.alert(title, msg); 4: } else { 5: $.messager.show({ 6: title: title, 7: msg: msg, 8: showType: 'show' 9: }); 10: } 11: }
确认框
1: function showConfirm(title, msg, callback) { 2: $.messager.confirm(title, msg, function (r) { 3: if (r) { 4: if (jQuery.isFunction(callback)) 5: callback.call(); 6: } 7: }); 8: } 进度框
1: function showProcess(isShow, title, msg) { 2: if (!isShow) { 3: $.messager.progress('close'); 4: return; 5: } 6: var win = $.messager.progress({ 7: title: title, 8: msg: msg 9: }); 10: }

例如在表单提交时,为了防止重复提交,会显示一个进度框。提交完成时,关闭进度框并提示操作信息:

1: function submitForm(url) { 2: $('#ff').form('submit', { 3: url: (url === undefined ? "/Ajax/Common.ashx" : url) + "?Type=" + typeCode, 4: onSubmit: function () { 5: var flag = $(this).form('validate'); 6: if (flag) { 7: showProcess(true, '温馨提示', '正在提交数据...'); 8: } 9: return flag 10: }, 11: success: function (data) { 12: showProcess(false); 13: if (data == 1) { 14: top.showMsg('温馨提示', '提交成功!'); 15: if (parent !== undefined) { 16: if ($.isFunction(window.reloadParent)) { 17: reloadParent.call(); 18: } else { 19: parent.$("#tt").datagrid('reload'); 20: parent.closeMyWindow(); 21: } 22: } 23: } else { 24: $.messager.alert('温馨提示', data); 25: } 26: }, 27: onLoadError: function () { 28: showProcess(false); 29: $.messager.alert('温馨提示', '由于网络或服务器太忙,提交失败,请重试!'); 30: } 31: }); 32: }关键页面代码如下:
1: <div class="easyui-layout" style="text-align: left; height: 270px;" fit="true"> 2: 3: <div region="center" border="false" style="padding: 10px; background: #fff; border: 1px solid #ccc;"> 4: 5: <form id="ff" method="post"> 6: 7: <input type="hidden" name="id" value="" /> 8: 9: <table border="0" cellpadding="0" cellspacing="0"> 10: 11: <tr> 12: 13: <td> 14: 15: <label for="AdminLogin"> 16: 17: 登录名:label> 18: 19: td> 20: 21: <td> 22: 23: <input class="easyui-validatebox" style="width: 300px;" type="text" required="true" 24: 25: validtype="length[0,20]" name="AdminLogin">input> 26: 27: td> 28: 29: tr> 30: 31: <tr> 32: 33: <td> 34: 35: <label for="RoleID"> 36: 37: 所属角色:label> 38: 39: td> 40: 41: <td> 42: 43: <input class="easyui-combobox" valuefield="ID" textfield="RoleName" panelheight="auto" 44: 45: editable="false" style="width: 300px;" url="/Ajax/Common.ashx?Type=GetRoles" 46: 47: required="true" name="RoleID">input> 48: 49: td> 50: 51: tr> 52: 53: <tr> 54: 55: <td colspan="2" style='color: Red'> 56: 57: 在编辑时,输入管理员密码表示重新设置密码。 58: 59: td> 60: 61: tr> 62: 63: <tr> 64: 65: <td> 66: 67: <label for="AdminPassword"> 68: 69: 密码:label> 70: 71: td> 72: 73: <td> 74: 75: <input class="easyui-validatebox" style="width: 300px;" type="text" validtype="length[6,20]" 76: 77: id='txtPassword' name="AdminPassword">input> 78: 79: td> 80: 81: tr> 82: 83: <tr> 84: 85: <td> 86: 87: <label for="AdminPassword2"> 88: 89: 确认密码:label> 90: 91: td> 92: 93: <td> 94: 95: <input class="easyui-validatebox" style="width: 300px;" type="text" validtype="length[6,20]" 96: 97: id='txtPassword2' name="AdminPassword2">input> 98: 99: td> 100: 101: tr> 102: 103: <tr> 104: 105: <td> 106: 107: <label for="Defatulflag"> 108: 109: 是否上架:label> 110: 111: td> 112: 113: <td> 114: 115: <input type="checkbox" name="Defatulflag" class="easyui-validatebox" type="text" 116: 117: required="true" value="1" /> 118: 119: td> 120: 121: tr> 122: 123: table> 124: 125: form> 126: 127: div> 128: 129: <div region="south" border="false" style="text-align: right; padding: 5px 5px 5px 0;"> 130: 131: <a class="easyui-linkbutton" iconcls="icon-save" href="javascript:void(0)" onclick="javascript:submitForm();"> 132: 133: 提交a> 134: 135: div> 136: 137: div> 138: 139: <script type="text/javascript"> 140: 141: $(function () { 142: 143: if (autoLoad == 1) { 144: 145: $('#txtPassword').keypress(function () { 146: 147: if ($(this).val().length > 0) { 148: 149: $('#txtPassword2').validatebox({ 150: 151: required: true 152: 153: }); 154: 155: } 156: 157: }).change(function () { 158: 159: if ($(this).val().length > 0) { 160: 161: $('#txtPassword2').validatebox({ 162: 163: required: true 164: 165: }); 166: 167: } else { 168: 169: $('#txtPassword2').validatebox({ 170: 171: required: false 172: 173: }); 174: 175: } 176: 177: }); 178: 179: 180: 181: } else { 182: 183: $('#txtPassword,#txtPassword2').validatebox({ 184: 185: required: true 186: 187: }); ; 188: 189: } 190: 191: }); 192: 193: script> 194:
效果如下:
image
image
image
窗口

窗口是用的非常频繁的,显示窗口:

1: $(function () { 2: $('body').append('
'
); 3: }); 4: function showMyWindow(title, href, width, height, modal, minimizable, maximizable) { 5: $('#myWindow').window({ 6: title: title, 7: width: width === undefined ? 600 : width, 8: height: height === undefined ? 400 : height, 9: content: '', 10: // href: href === undefined ? null : href, 11: modal: modal === undefined ? true : modal, 12: minimizable: minimizable === undefined ? false : minimizable, 13: maximizable: maximizable === undefined ? false : maximizable, 14: shadow: false, 15: cache: false, 16: closed: false, 17: collapsible: false, 18: resizable: false, 19: loadingMessage: '正在加载数据,请稍等片刻......' 20: }); 21: }

关闭窗口:

1: function closeMyWindow() {
2: $('#myWindow').window('close');
3: }
使用方式如下:
1: function onDataGridDblClickRow(rowIndex, rowData) { 2: 3: edit(); 4: 5: } 6: 7: function addType() { 8: 9: showMyWindow('用户管理 | 新建', '/WebPages/RoleManagement/AdminUser_Add.aspx', 600, 320) 10: 11: } 12: 13: function edit() { 14: 15: var row = $('#tt').datagrid('getSelected'); 16: 17: if (row) { 18: 19: showMyWindow('用户管理 | 编辑', '/WebPages/RoleManagement/AdminUser_Add.aspx?ID=' + row.ID + '&autoLoad=1', 600, 320) 20: 21: } else { 22: 23: showMsg("温馨提示", "请选择一行!"); 24: 25: } 26: 27: }
窗口弹出有本页弹出,有时由于框架页太小,经常会使用顶层窗口弹出,如:
1: function showSetPicWindow(adname, id) { 2: 3: top.showMyWindow(adname + " | 广告图设置", '/WebPages/ADManagement/ADPicturesManagement.aspx?TypeCode=ADPictures&ID=' + id + '&ATCode=KTVAdvert', 707, 440); 4: 5: }
效果如下:
image
表单

一个系统总是不乏表单的,自然表单的提交与赋值自然是频繁的。如果使用C#,可以通过反射减少工作量,但是我更趋向把工作量留给前台。比如提交:

1: function submitForm(url) { 2: $('#ff').form('submit', { 3: url: (url === undefined ? "/Ajax/Common.ashx" : url) + "?Type=" + typeCode, 4: onSubmit: function () { 5: var flag = $(this).form('validate'); 6: if (flag) { 7: showProcess(true, '温馨提示', '正在提交数据...'); 8: } 9: return flag 10: }, 11: success: function (data) { 12: showProcess(false); 13: if (data == 1) { 14: top.showMsg('温馨提示', '提交成功!'); 15: if (parent !== undefined) { 16: if ($.isFunction(window.reloadParent)) { 17: reloadParent.call(); 18: } else { 19: parent.$("#tt").datagrid('reload'); 20: parent.closeMyWindow(); 21: } 22: } 23: } else { 24: $.messager.alert('温馨提示', data); 25: } 26: }, 27: onLoadError: function () { 28: showProcess(false); 29: $.messager.alert('温馨提示', '由于网络或服务器太忙,提交失败,请重试!'); 30: } 31: }); 32: }

值得说明的是:

  1. typeCode来自母版页,为页面名。
  2. url为提交的URL。
  3. onSubmit事件会触发表单验证,如果验证通过会显示提交进度遮罩层。如果觉得不够用,可以自己扩展。
  4. success事件会关闭进度,如果提交成功会显示成功提示,如果存在父窗口,会刷新父页面DataGrid并且关闭当前窗口。当然也可以实现reloadParent函数来个性化处理。
  5. 表单id和DataGrid的id都是固定的,如果没有效果请检查id。
  6. 关于表单的这里只写了提交,赋值的代码写在母版页了,以后再说。

页面html的提交代码如下:

1: <a class="easyui-linkbutton" iconcls="icon-save" href="javascript:void(0)" onclick="javascript:submitForm('/Ajax/ShortMMS_Common.ashx');"> 2: 提交a>

有些页面可能刷新DataGrid还不够,需要刷新页面,于是可以使用下面的JS:

1:

最后,附上完整的JS代码:

1: //时间格式化 2: Date.prototype.format = function (format) { 3: if (!format) { 4: format = "yyyy-MM-dd hh:mm:ss"; 5: } 6: var o = { 7: "M+": this.getMonth() + 1, // month 8: "d+": this.getDate(), // day 9: "h+": this.getHours(), // hour 10: "m+": this.getMinutes(), // minute 11: "s+": this.getSeconds(), // second 12: "q+": Math.floor((this.getMonth() + 3) / 3), // quarter 13: "S": this.getMilliseconds() 14: // millisecond 15: }; 16: if (/(y+)/.test(format)) { 17: format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 18: } 19: for (var k in o) { 20: if (new RegExp("(" + k + ")").test(format)) { 21: format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); 22: } 23: } 24: return format; 25: }; 26: function fomatDate(str) { 27: return (new Date(parseInt(str.substring(str.indexOf('(') + 1, str.indexOf(')'))))).format("yyyy-MM-dd hh:mm:ss"); 28: } 29: function showMsg(title, msg, isAlert) { 30: if (isAlert !== undefined && isAlert) { 31: $.messager.alert(title, msg); 32: } else { 33: $.messager.show({ 34: title: title, 35: msg: msg, 36: showType: 'show' 37: }); 38: } 39: } 40: $(function () { 41: $('body').append('
'
); 42: }); 43: function showMyWindow(title, href, width, height, modal, minimizable, maximizable) { 44: $('#myWindow').window({ 45: title: title, 46: width: width === undefined ? 600 : width, 47: height: height === undefined ? 400 : height, 48: content: '', 49: // href: href === undefined ? null : href, 50: modal: modal === undefined ? true : modal, 51: minimizable: minimizable === undefined ? false : minimizable, 52: maximizable: maximizable === undefined ? false : maximizable, 53: shadow: false, 54: cache: false, 55: closed: false, 56: collapsible: false, 57: resizable: false, 58: loadingMessage: '正在加载数据,请稍等片刻......' 59: }); 60: } 61: function closeMyWindow() { 62: $('#myWindow').window('close'); 63: } 64: function submitForm(url) { 65: $('#ff').form('submit', { 66: url: (url === undefined ? "/Ajax/Common.ashx" : url) + "?Type=" + typeCode, 67: onSubmit: function () { 68: var flag = $(this).form('validate'); 69: if (flag) { 70: showProcess(true, '温馨提示', '正在提交数据...'); 71: } 72: return flag 73: }, 74: success: function (data) { 75: showProcess(false); 76: if (data == 1) { 77: top.showMsg('温馨提示', '提交成功!'); 78: if (parent !== undefined) { 79: if ($.isFunction(window.reloadParent)) { 80: reloadParent.call(); 81: } else { 82: parent.$("#tt").datagrid('reload'); 83: parent.closeMyWindow(); 84: } 85: } 86: } else { 87: $.messager.alert('温馨提示', data); 88: } 89: }, 90: onLoadError: function () { 91: showProcess(false); 92: $.messager.alert('温馨提示', '由于网络或服务器太忙,提交失败,请重试!'); 93: } 94: }); 95: } 96: function deleteConfirm() { 97: return showConfirm('温馨提示', '确定要删除吗?'); 98: } 99: function showConfirm(title, msg, callback) { 100: $.messager.confirm(title, msg, function (r) { 101: if (r) { 102: if (jQuery.isFunction(callback)) 103: callback.call(); 104: } 105: }); 106: } 107: function showProcess(isShow, title, msg) { 108: if (!isShow) { 109: $.messager.progress('close'); 110: return; 111: } 112: var win = $.messager.progress({ 113: title: title, 114: msg: msg 115: }); 116: } 117:
这篇就写到这里吧。如有不足之处,还望大家补充。累了,就先写到这里了。
阅读(1913) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~