公司有这么一个需求,根据不同的权限显示一张表不同的字段。这个要命的需求给UI层带来不少麻烦,首先,我们采用easyUI的datagrid显示表格数据,而表格的列是静态写死的,如果要根据不同权限显示不同的字段导致必须通过结果集来show字段,但是easyUI的源代码中是ajax拿到数据后直接根据列去显示,使得我不得不修改easyUI类库。
先说一下思路:首先UI的datagrid中没有指定任何列,ajax提交成功后同时返回列的信息,先进行列的动态绑定,然后显示数据内容。
1.UI
- <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="DynamicDatagird.aspx.cs"
- Inherits="WebUtils.DynamicDatagird"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <headrunat="server">
- <title>动态datagrid</title>
- <scriptsrc="Scripts/jquery-1.4.1.js"type="text/javascript"></script>
- <scriptsrc="Scripts/jquery.easyui.min.js"type="text/javascript"></script>
- <linkhref="Style/themes/default/easyui.css"rel="stylesheet"type="text/css"/>
- <scripttype="text/javascript">
- $(function(){
- $('#tbUsers').datagrid({
- title:'MyTitle',
- width:600,
- height:350,
- dataType:'json',
- url:'GetAjaxData.ashx?action=GetUserList2',
- columns:[[]],
- pagination:true,
- pageSize:5,//每页记录数
- pageList:[5,10,15,20,30,50],//分页记录数数组
- onLoadSuccess:function(data,param){
- }
- });
- });
- </script>
- </head>
- <body>
- <formid="form1"runat="server">
- <div>
- <tableid="tbUsers">
- </table>
- </div>
- </form>
- </body>
- </html>
2.easyUI类库的修改(位置在datagrid ajax提交位置L6220处)
- function_43f(){
- $.ajax({type:opts.method,url:opts.url,data:_43d,dataType:"json",success:function(data){
- //动态添加列
- if(!!data&&!!data.columns){
- varopts=$.data(_43a,"datagrid").options;
- var_369=$.data(_43a,"datagrid").panel;
- varcols=$.data(_43a,"datagrid").options.columns[0];
- varcolCount=cols.length;
- if(colCount==0){
- //cols.slice(0,cols.length);//清除数组内容
- for(vari=0;i<data.columns.length;i++){
- varcol={
- field:data.columns[i].field,
- title:data.columns[i].title,
- width:data.columns[i].width,
- align:data.columns[i].align
- };
- cols.push(col);
- }
- //UI添加列
- if(colCount==0&&opts.columns){
- vart=_370(opts.columns);
- $("div.datagrid-view2div.datagrid-header-inner",_369).html(t);
- }
- }
- }
- setTimeout(function(){
- _440();
- },0);
- if(!!data&&!!data.rows){
- _3a2(_43a,data);
- }
- setTimeout(function(){
- _42d(_43a);
- },0);
- },error:function(){
- setTimeout(function(){
- _440();
- },0);
- if(opts.onLoadError){
- opts.onLoadError.apply(_43a,arguments);
- }
- }
- });
- };
3.后台提供数据(一般处理程序)
- publicvoidGetUserList(HttpContextcontext){
- stringstrJson=@"{
- 'total':20,
- 'rows':[
- {'name':'zhangsan01','age':'21','hobby':'001'},
- {'name':'zhangsan02','age':'21','hobby':'001'},
- {'name':'zhangsan03','age':'21','hobby':'001'},
- {'name':'zhangsan04','age':'21','hobby':'001'},
- {'name':'zhangsan05','age':'21','hobby':'001'}
- ],
- 'columns':[
- {'field':'name','title':'Name','width':100,'align':'center'},
- {'field':'age','title':'Age','width':100,'align':'center'},
- {'field':'hobby','title':'Hobby','width':100,'align':'center'}
- ]
- }";
- strJson=strJson.Replace("'","/"");
- HttpResponseresponse=context.Response;
- response.ContentType="text/json";
- response.Write(strJson);
- }
这样就完成了动态绑定列名。功能是可以了,还不利于大量生产,需要提供自动集合转Json的类。
为此,我设计了一个JDataGrid类用于将List的集合生成我的DataGrid需要的数据格式(包含列的信息)。
1.定义User类,就作为实体类
- namespaceWebUtils{
- publicclassUser{
- publicstringName{get;set;}
- publicintAge{get;set;}
- publicstringGender{get;set;}
- publicstringHobby{get;set;}
- }
- }
2.定义JDataGrid类和JColumn类
- publicclassJDataGrid{
- publicinttotal{get;set;}
- publicList<Dictionary<string,object>>rows{get;set;}
- publicList<JColumn>columns{get;set;}
- publicstaticList<Dictionary<string,object>>ConvertRows(IListlist){
- List<Dictionary<string,object>>rowsList=newList<Dictionary<string,object>>();
- if(list!=null){
- foreach(objectobjinlist){
- Dictionary<string,object>dic=newDictionary<string,object>();
- Typet=obj.GetType();
- foreach(PropertyInfopiint.GetProperties()){
- stringkey=pi.Name;
- objectvalue=pi.GetValue(obj,null);
- dic.Add(key,value);
- }
- rowsList.Add(dic);
- }
- }
- returnrowsList;
- }
- publicstringConvertToJson(){
- StringBuildersb=newStringBuilder();
- sb.AppendFormat("{{/"total/":{0},/"rows/":[",total);
- //添加数据
- if(rows!=null&&rows.Count>0){
- for(inti=0;i<rows.Count;i++){
- sb.Append("{");
- foreach(stringkeyinrows[i].Keys){
- if(rows[i][key]isValueType){
- sb.AppendFormat("/"{0}/":{1},",key,rows[i][key]);
- }else{
- sb.AppendFormat("/"{0}/":/"{1}/",",key,rows[i][key]);
- }
- }
- sb.Remove(sb.Length-1,1);
- sb.Append("}");
- if(i!=rows.Count-1){
- sb.Append(",");
- }
- }
- }
- sb.Append("],");
- sb.Append("/"columns/":[");
- //添加列
- if(columns!=null&&columns.Count>0){
- for(inti=0;i<columns.Count;i++){
- sb.Append(columns[i].ConvertToJson());
- if(i!=columns.Count-1){
- sb.Append(",");
- }
- }
- }
- sb.Append("]}");
- stringstr=sb.ToString();
- returnstr;
- }
- }
- publicclassJColumn{
- publicint?rowspan{get;set;}
- publicint?colspan{get;set;}
- publicbool?checkbox{get;set;}
- publicstringfield{get;set;}
- publicstringtitle{get;set;}
- publicintwidth{get;set;}
- publicstringalign{get;set;}
- publicstringConvertToJson(){
- StringBuildersb=newStringBuilder();
- sb.Append("{");
- if(rowspan!=null){
- sb.AppendFormat("/"rowspan/":{0},",rowspan);
- }
- if(colspan!=null){
- sb.AppendFormat("/"colspan/":{0},",colspan);
- }
- if(checkbox!=null){
- sb.AppendFormat("/"checkbox/":{0},",checkbox);
- }
- sb.AppendFormat("/"field/":/"{0}/",",field);
- sb.AppendFormat("/"width/":{0},",width);
- sb.AppendFormat("/"align/":/"{0}/",",align);
- sb.AppendFormat("/"title/":/"{0}/",",title);
- sb.Remove(sb.Length-1,1);
- sb.Append("}");
- stringstr=sb.ToString();
- returnstr;
- }
- }
3.后台获取数据(一般处理程序)
- publicvoidGetUserList2(HttpContextcontext){
- List<User>userList=newList<User>();
- for(inti=0;i<10;i++){
- userList.Add(newUser{
- Name="Name"+(i+1),
- Age=20+i,
- Gender=i%3==0?"男":"女",
- Hobby=i.ToString()
- });
- }
- List<JColumn>colList=newList<JColumn>(){
- newJColumn{field="Name",title="姓名",width=100,align="center"},
- newJColumn{field="Age",title="年龄",width=100,align="center"},
- newJColumn{field="Gender",title="性别",width=50,align="center"},
- newJColumn{field="Hobby",title="兴趣",width=150,align="center"},
- };
- JDataGriddg=newJDataGrid{
- total=20,
- rows=JDataGrid.ConvertRows(userList),
- columns=colList,
- };
- stringstrJson=dg.ConvertToJson();
- HttpResponseresponse=context.Response;
- response.ContentType="text/json";
- response.Write(strJson);
- }
对比前面的方法,显示代码通用多了。
演示下载
本文介绍了一种在easyUI的datagrid中实现动态显示不同权限下表格字段的方法。通过对easyUI类库进行修改,并结合自定义的JDataGrid类,实现了根据权限加载不同的列配置和数据。此方案适用于需要按权限定制展示内容的应用场景。
5948

被折叠的 条评论
为什么被折叠?



