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

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

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

控件赋值

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

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

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

   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数据呢?先看看大体结构:

   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),如果觉得性能不行,请自己用存储过程实现,这里不考虑性能:
   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呢?如下:

   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数据如下:

 

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

时间: 2024-09-20 12:03:33

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

JQuery EasyUi之界面设计——前言与界面效果(一)

如果冯巩的开场白是"观众朋友们,我想死你们了",那么我的开场白是"最近一直很忙,很久没有发文了". 前面说过了EXT.NET,这里顺便再说说JQuery EasyUI.为啥我会选择JQuery EasyUI呢?主要有以下几点: 轻量级. 基本的组件都用,即"麻雀虽小五脏俱全". 使用简洁方便,比如支持html+js. 可扩展性. 可维护性.世上没有完美的产品,而且其对IE6的兼容性还存在一些问题,但相比extjs,其还是很方便阅读和修改的. 简单

JQuery EasyUi之界面设计——通用的JavaScript(二)

  所谓磨刀不误砍柴工,先写点通用的代码,后面开发起来效率就高多了.多余的话就不敲了,先简单介绍介绍吧. 时间格式化 对于序列化JSON,我喜欢用JSON.NET,为了方便,我定义了一个扩展方法,如下面代码: 1: /// <summary> 2: /// 将对象序列化为JSON数据 3: /// </summary> 4: /// <param name="instance"></param> 5: /// <returns>

jQuery easyUI form ajax提交是假的吗??

问题描述 jQuery easyUI form ajax提交是假的吗?? 5C 今天学习easyUI的form表单,说他有个ajax提交数据的功能,我在服务器端设置了一道屏障,如果不是ajax请求则跳转到404页面.结果,每次提交表单都是404了,看了下请求头,根本不是ajax提交.我对比了一下其他ajax请求头,成功的都会有个 X-Request-With:""XMLHttpRequest"" 但是form的ajax方式就没有easyUI所说的ajax提交是不是假

jquery easyUI中ajax异步校验用户名_jquery

以前无聊写过一个小东西,其中有一个功能就是添加用户,当时并没有考虑用户名重复的问题,今日闲来无事,打算利用ajax的异步刷新来校验用户名是否存在.自己也是新手,刚刚大三,哈哈写的不对的地方请指出. 放上效果图: 首先是编写前的准备 我并不是用原生的js来写的ajax而是用的jqueryeasyUI框架中的ajax,所以在使用之前就必须要引入jquery的js文件. <link rel="stylesheet" type="text/css" href=&quo

19个免费的UI界面设计工具及资源

原文:http://www.oschina.net/news/16602/19-free-ui-design-tools-toolkits-and-resources-for-designers 开源中国社区刚发布了一篇<21个免费的UI界面设计工具.资源及网站>,介绍了免费的Web UI.移动UI.线框工具等.作为该文章的续篇,本文再介绍19个免费UI设计工具及资源,目的同样是帮助你通过发现新的.完美的工具来学习新的技能. 列表如下: DHTMLX DHTMLX 是一个JavaScript库

jquery easyui 的dialog怎么样在里面加载一个页面,页面的的数据从数据库返回出来

问题描述 jquery easyui 的dialog怎么样在里面加载一个页面,页面的的数据从数据库返回出来 如图 解决方案 嵌套iframe,或者用jquery加载网页到divhttp://blog.csdn.net/linlin_juejue/article/details/8211291 解决方案二: AJAX JSON返回,写一个查询的函数 解决方案三: jquery easyui dialog可以两种方式使用: 第一种: 1.定义div,使用iframe 解决方案四: dialog+da

《jQuery EasyUI开发指南》——导读

前言 我们都知道,Java语言本身有专注于后端的特点.如果使用Java语言来开发项目,可以把Java代码嵌入前端中来.但实际上,专业人士并不提倡这么做.因为前端的开发就应该由前端语言来做,后端的开发就应该由后端语言来做,这样可以降低耦合性,也能防止代码混乱产生的问题. 在前端开发方面,现在诞生了很多开发框架.一般来说,前端开发工程师需要掌握的技能有HTML.CSS.JavaScript等,以及符合W3C规则的编程规范,但掌握了这些技能还是远远不够的,尤其是在Web技术迅猛发展.日新月异的今天.

JQuery+EasyUI轻松实现步骤条效果_jquery

EasyUI 简介 easyui是一种基于jQuery的用户界面插件集合. easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能. 使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面. easyui是个完美支持HTML5网页的完整框架. easyui节省您网页开发的时间和规模. easyui很简单但功能强大的. jQuery EasyUI 提供易于使用的组件,它使 Web 开发人员能快速地在流行的 jQuery 核心和 HTML5

jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法_jquery

先给大家分享数据校验显示效果 Web前端数据校验组件 Web项目中客户端与服务端的交互离不开Form表单,Form表单中最常用的元素莫过于input标签,input标签首先要用的肯定是text文本框啦! input文本框允许用户任意输入,难免会会有用户输入一些不符合规定的数据,此时,在提交之前对数据校验是很有必要的,如果等到提交到服务端再校验就会大大降低用户体验啦. 前端校验有很多现成的组件,比较好用的有 EasyUI 的 validatebox 插件,提示界面做的相当友好,只是validate