前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JQuery EasyUi之界面设计——母版页以及Ajax的通用处理(三)

JQuery EasyUi之界面设计——母版页以及Ajax的通用处理(三)

作者头像
雪雁-心莱科技
发布2018-12-27 10:33:07
1.8K0
发布2018-12-27 10:33:07
举报
文章被收录于专栏:magicodesmagicodes

前面介绍过JS了,就这样个人认为还不够用。

因为JS文件是死的,无法使用服务器代码,自然不够灵活。那么通过母版页就完善了这一点。那么下面举一个例子——控件赋值。

控件赋值

前面说过easyui的form自带验证、提交、重置与赋值,那么如何利用这个赋值呢?千篇一律的写赋值代码总是那么的令人厌烦,尤其是元素比较多的时候,用反射嘛又怕别人诟病,那么就用JS来负责这一切吧.

那么如何做到通用呢?那母版页就是不错的选择。

下面贴出母版页完整代码:

代码语言:javascript
复制
1: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Form.master.cs" Inherits="Singer.Form" %>
   2:  
   3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   4: <html xmlns="http://www.w3.org/1999/xhtml">
   5: <head runat="server">
   6:     <title></title>
   7:     <link href="/Scripts/jquery-easyui-1.2.5/themes/default/easyui.css" rel="stylesheet"
   8:         type="text/css" />
   9:     <link href="/Styles/form.css" rel="stylesheet" type="text/css" />
  10:     <link href="/Scripts/jquery-easyui-1.2.5/themes/icon.css" rel="stylesheet" type="text/css" />
  11:     <script src="/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
  12:     <script src="/Scripts/jquery-easyui-1.2.5/jquery.easyui.min.js" type="text/javascript"></script>
  13:     <script src="/Scripts/jquery-easyui-1.2.5/locale/easyui-lang-zh_CN.js" type="text/javascript"></script>
  14:     <script src="/Scripts/common.js" type="text/javascript"></script>
  15:     <asp:ContentPlaceHolder ID="head" runat="server">
  16:     </asp:ContentPlaceHolder>
  17: </head>
  18: <body>
  19:     <script type="text/javascript">
  20:         var ajaxUrl = '/Ajax/Common.ashx';
  21:         //表单ID
  22:         var id = '<%=Request.QueryString["ID"] %>';
  23:         //是否自动加载表单,编辑用
  24:         var autoLoad = '<%=Request.QueryString["autoLoad"] %>';
  25:         //Ajax类型【页面名】
  26:         var typeCode = "<%=System.IO.Path.GetFileName(HttpContext.Current.Request.Path) %>";
  27:         $(function () {
  28:             if ($.isFunction(window.setAjaxUrl)) {
  29:                 setAjaxUrl.call();
  30:             }
  31:             //加载数据
  32:             if (autoLoad == 1 && id !== undefined && id != '') {
  33:                 $('#ff').form('load', ajaxUrl + '?autoLoad=1&Type=' + typeCode + '&id=' + id + "&_" + Math.floor(Math.random() * (1000 + 1)));
  34:  
  35:             }
  36:         });
  37:     </script>
  38:     <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
  39:     </asp:ContentPlaceHolder>
  40: </body>
  41: </html>

从代码中可以看出:

  1. 页面上定义了3个全局JS变量,有注释,我就不赘述了。
  2. setAjaxUrl函数在表单赋值加载前执行,可以实现用于更改上面的3个变量的值,或者作其他作用,建议命名为beforeFormLoad。
  3. typeCode的值为页面名,比如“index.aspx”,提交给处理程序用于判断是哪个页面,以便返回对应的JSON数据。

后台处理逻辑

那么处理程序如何返回对应的JSON数据呢?先看看大体结构:

image
image
代码语言:javascript
复制
1: case "ADMINUSER_ADD.ASPX":
   2:     #region 用户添加
   3:     {
   4:         if (context.Request["autoLoad"] == "1")
   5:             context.Response.Write(db.TB_Admin.FirstOrDefault(p => p.ID == Convert.ToInt32(context.Request["id"])).ToJson());
   6:         else
   7:         {
   8:             if (context.Request["id"].IsEmpty())
   9:             {
  10:                 if (context.Request["AdminPassword"].Trim() == string.Empty)
  11:                 {
  12:                     context.Response.Write("请输入密码!!");
  13:                     return;
  14:                 }
  15:                 if (context.Request["AdminPassword"] != context.Request["AdminPassword2"])
  16:                 {
  17:                     context.Response.Write("两次密码不一致!!");
  18:                     return;
  19:                 }
  20:                 var isExist = db.TB_Admin.FirstOrDefault(p => p.AdminLogin == context.Request["AdminLogin"].Trim());
  21:                 if (isExist != null)
  22:                 {
  23:                     context.Response.Write("用户名重复!!");
  24:                     return;
  25:                 }
  26:                 TB_Admin singer = new TB_Admin()
  27:                 {
  28:                     Defatulflag = context.Request["Defatulflag"] == "1" ? 1 : 0,
  29:                     AdminLogin = context.Request["AdminLogin"].Trim(),
  30:                     CreateBy = userID.ToString(),
  31:                     CreateDate = DateTime.Now,
  32:                     LastLoginDate = null,
  33:                     Password = Utility.UserINFOManager.PasswordEncry(context.Request["AdminPassword"].Trim()),
  34:                     RoleID = Convert.ToInt32(context.Request["RoleID"])
  35:                 };
  36:                 db.TB_Admin.InsertOnSubmit(singer);
  37:                 db.SubmitChanges();
  38:             }
  39:             else
  40:             {
  41:                 var isExist = db.TB_Admin.FirstOrDefault(p => p.ID == Convert.ToInt32(context.Request["id"]));
  42:                 isExist.Defatulflag = context.Request["Defatulflag"] == "1" ? 1 : 0;
  43:                 isExist.AdminLogin = context.Request["AdminLogin"].Trim();
  44:                 isExist.RoleID = Convert.ToInt32(context.Request["RoleID"]);
  45:                 if (context.Request["AdminPassword"].Trim() != string.Empty)
  46:                     isExist.Password = Utility.UserINFOManager.PasswordEncry(context.Request["AdminPassword"].Trim());
  47:                 db.SubmitChanges();
  48:             }
  49:             context.Response.Write("1");
  50:             return;
  51:         }
  52:     }
  53:     break;
  54:     #endregion

从上面代码可以看出:

  1. 通过Type参数,可以获取请求的页面。
  2. 通过autoLoad参数,可以判断是否是加载赋值。注意FirstOrDefault函数,是获取第一条数据,然后通过ToJson方法(自己定义的扩展方法)转换为JSON数据。
  3. 通过id参数,可以判断是否为编辑。
  4. 以上使用的是LINQ to SQL,个人认为使用LINQ to SQl开发小项目还是挺快的。关于LINQ to SQL的具体使用,就不说了。顺便送大家一段服务器分页通用代码(仅支持LINQ2SQL),如果觉得性能不行,请自己用存储过程实现,这里不考虑性能:

代码语言:javascript
复制
1: /// <summary>
   2: /// 当前页
   3: /// </summary>
   4: private int pageIndex = Convert.ToInt32(HttpContext.Current.Request["page"] ?? "1");
   5: /// <summary>
   6: /// 每页显示记录数
   7: /// </summary>
   8: private int pageSize = Convert.ToInt32(HttpContext.Current.Request["rows"] ?? "1");
   9: /// <summary>
  10: /// 获取分页JSON
  11: /// </summary>
  12: /// <typeparam name="T"></typeparam>
  13: /// <param name="data"></param>
  14: /// <returns></returns>
  15: private string GetPageingJson<T>(IQueryable<T> data)
  16: {
  17:     return string.Format("{{\"total\":\"{0}\",\"rows\":{1}}}", data.Count(), data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToJson());
  18: }
  1. 相比使用各种.NET Ajax框架,我还是喜欢按上面这种模式,虽然很多Ajax框架可以实现js调用C#方法,可以调用WebService,可以操作服务器控件,但是我仍然痴迷上面的模式,因为个人觉得这样精简、易控制、一目了然、没有ViewState、没有服务器控件、甚至没有Cookie和Session(需要实现接口)。。。。

前端HTML

刚才贴的后台处理逻辑是用户管理的编辑界面,那么前端HTML呢?如下:

代码语言:javascript
复制
1: <%@ Page Title="" Language="C#" MasterPageFile="~/Form.Master" AutoEventWireup="true"
   2:     CodeBehind="AdminUser_Add.aspx.cs" Inherits="Singer.WebPages.RoleManagement.AdminUser_Add" %>
   3:  
   4: <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
   5: </asp:Content>
   6: <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   7:     <div class="easyui-layout" style="text-align: left; height: 270px;" fit="true">
   8:         <div region="center" border="false" style="padding: 10px; background: #fff; border: 1px solid #ccc;">
   9:             <form id="ff" method="post">
  10:             <input type="hidden" name="id" value="<%=Request.QueryString["ID"] %>" />
  11:             <table border="0" cellpadding="0" cellspacing="0">
  12:                 <tr>
  13:                     <td>
  14:                         <label for="AdminLogin">
  15:                             登录名:</label>
  16:                     </td>
  17:                     <td>
  18:                         <input class="easyui-validatebox" style="width: 300px;" type="text" required="true"
  19:                             validtype="length[0,20]" name="AdminLogin"></input>
  20:                     </td>
  21:                 </tr>
  22:                 <tr>
  23:                     <td>
  24:                         <label for="RoleID">
  25:                             所属角色:</label>
  26:                     </td>
  27:                     <td>
  28:                         <input class="easyui-combobox" valuefield="ID" textfield="RoleName" panelheight="auto"
  29:                             editable="false" style="width: 300px;" url="/Ajax/Common.ashx?Type=GetRoles"
  30:                             required="true" name="RoleID"></input>
  31:                     </td>
  32:                 </tr>
  33:                 <tr>
  34:                     <td colspan="2" style='color: Red'>
  35:                         在编辑时,输入管理员密码表示重新设置密码。
  36:                     </td>
  37:                 </tr>
  38:                 <tr>
  39:                     <td>
  40:                         <label for="AdminPassword">
  41:                             密码:</label>
  42:                     </td>
  43:                     <td>
  44:                         <input class="easyui-validatebox" style="width: 300px;" type="text" validtype="length[6,20]"
  45:                             id='txtPassword' name="AdminPassword"></input>
  46:                     </td>
  47:                 </tr>
  48:                 <tr>
  49:                     <td>
  50:                         <label for="AdminPassword2">
  51:                             确认密码:</label>
  52:                     </td>
  53:                     <td>
  54:                         <input class="easyui-validatebox" style="width: 300px;" type="text" validtype="length[6,20]"
  55:                             id='txtPassword2' name="AdminPassword2"></input>
  56:                     </td>
  57:                 </tr>
  58:                 <tr>
  59:                     <td>
  60:                         <label for="Defatulflag">
  61:                             是否上架:</label>
  62:                     </td>
  63:                     <td>
  64:                         <input type="checkbox" name="Defatulflag" class="easyui-validatebox" type="text"
  65:                             required="true" value="1" />
  66:                     </td>
  67:                 </tr>
  68:             </table>
  69:             </form>
  70:         </div>
  71:         <div region="south" border="false" style="text-align: right; padding: 5px 5px 5px 0;">
  72:             <a class="easyui-linkbutton" iconcls="icon-save" href="javascript:void(0)" onclick="javascript:submitForm();">
  73:                 提交</a> <%--<a class="easyui-linkbutton" iconcls="icon-no" href="javascript:void(0)" onclick="$('#ff').form('clear');">
  74:                     重置</a>--%>
  75:         </div>
  76:     </div>
  77:     <script type="text/javascript">
  78:         $(function () {
  79:             if (autoLoad == 1) {
  80:                 $('#txtPassword').keypress(function () {
  81:                     if ($(this).val().length > 0) {
  82:                         $('#txtPassword2').validatebox({
  83:                             required: true
  84:                         });
  85:                     }
  86:                 }).change(function () {
  87:                     if ($(this).val().length > 0) {
  88:                         $('#txtPassword2').validatebox({
  89:                             required: true
  90:                         });
  91:                     } else {
  92:                         $('#txtPassword2').validatebox({
  93:                             required: false
  94:                         });
  95:                     }
  96:                 });
  97:  
  98:             } else {
  99:                 $('#txtPassword,#txtPassword2').validatebox({
 100:                     required: true
 101:                 }); ;
 102:             }
 103:         });
 104:     </script>
 105: </asp:Content>

值得注意的是:

  1. 这里使用的控件均为HTML控件。
  2. 请注意name属性,该属性决定提交的post参数名,同时也是form加载赋值的参数名,也就是这里的值要与后台输出的JSON要对应。
  3. 返回的JSON数据如下:
image
image

这一篇就写到这里吧。由于最近忙,又耽误了。。。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-04-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 控件赋值
  • 后台处理逻辑
  • 前端HTML
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档