使用jquery html模板对Json数据进行组合显示

在Ajax提交之后,我们一般返回的数据形式大多数都是返回的是Json 数据回来,然后结合美工提供的html把Json进行组合。

问题就出在这里,当html代码短少时,问题不大,但是一旦内容过多,那么此时问题就暴露出来了。

下面贴一张相关的代码图片,瞧瞧是如此的犀利。

此时的你是不是已经蛋疼了呢?

不管你疼不疼,我反正是疼了。gan!

先不说里面的json元素使用情况,单单是里面的双引号嵌套单引号,就让人为之疯狂了。

那么接下来,将介绍关于Jquery中一款关于HMTL模板的插件

jquery.tmpl.js  --22.2KB

jquery.tmpl.min.js --5.97KB

看一个Demo

html 代码

<body>
    <form id="form1" runat="server">
    <div>
      <ul id="ulContent">
       <li>
        我的ID:<label>1</label><br/>
        我的年龄:<label>22</label><br/>
        我的姓名:<label>abcd</label><br/>
        我的性别:<label>男</label><br/>
        
       </li>
      </ul>

      <br/>
      <input type="button" value="测试一下" id="btnSure" />
    </div>
    </form>
</body>

那么进行Ajax 提交之后,返回更新的内容是 整个<li>标签的内容,所以我们将对这段<li>标签的内容进行模板化。

<script id="TemplateStudent" type="text/x-jquery-tmpl">
<li>
我的ID:<label>${Id}</label><br/>
我的年龄:<label >${Age}</label><br/> 
我的姓名:<label>${Name}</label><br/>
我的性别:<label>${Sex}</label><br/>

<input type="button" value="点击我" id="btnId${Id}" onclick="fashionB(${Id});"/>

</li>
</script>

当然还有这种写法<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>

还有就是对应的JS调用情况了

<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script src="Scripts/jquery.tmpl.js" type="text/javascript"></script>
<script type="text/javascript">
    function fashionB(id) {
        alert(id);
    }
    
    $(document).ready(function () {
        $("#btnSure").click(function () {
            $.post("Demo", {}, function (result, resultState) {
                if (resultState == "success") {
                    var resultJson = eval(result);
                    //TemplateStudent
                    $("#ulContent").html($("#TemplateStudent").tmpl(resultJson));
                }
            });
        });
    });
</script>

在$("#ulContent").html($("#TemplateStudent").tmpl(resultJson));这段代码中$("#TemplateStudent")这个就是我们用Script标签包裹的html模板ID。把返回的Json数据作为参数tmpl()函数当中,剩下的事情就交给我们定义好的模板了。

(小提示,模板的里面的属性标记,必须要与你后台 类 属性一致)

大家在看模板的时候,可能已经注意到这个script标签的type属性了,text/x-jquery-tmpl ,但是我推荐大家使用这种方式 type="text/html",而不是上面那种,至于为什么,你自己动手试一下就知道了。之前的介绍,只是jquery.tmpl.js 最简单的使用方式,当然还有其他针对我们平常遇到的情况解决方案。

第二种使用方式

比如说在描述一个学生信息时,可能要把他的性别罗列出来,那么我们在设计数据库时,上面那些人如果用char类型还好,直接写入男女,但是可能是  bit  也有可能是int ,那么我们在读取之后,在组合json时,就要写if条件判断了。

 我的性别:
{{if Sex==0}}
<label class='sex${colorSex(Sex)}'>男</label>
{{else}}
<label class='sex${colorSex(Sex)}'>女</label>
{{/if}}<br/>

 0为男,1为女 这就是关于在模板中加入if逻辑的使用,还有就是在<label>标签中在class属性中也使用了模板标记

那么这个标记中也加入了我们js函数在配合模板使用.

Css

<style type="text/css"> 
    .sexBoy{ color:Blue;}
    .sexGirl{ color:Red;}
    
</style>

JS

function colorSex(sex) {
        return sex == 0 ? "Boy" : "Girl";
}

这个小功能主要是区分男女颜色各不同。

第三种使用方式。

在说之前,相信大家对Jquery中的each函数不陌生,接下来我们要介绍的就是在模板中使用each

为了配合这种使用方式我们在后台类中加入一个属性,

/// <summary>
/// 我的标签
/// </summary>
public string[] Label { get; set; }



后台handler

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
/// <summary>
///DemoHander 的摘要说明
/// </summary>
public class DemoHander:IHttpHandler
{
	public DemoHander()
	{
		//
		//TODO: 在此处添加构造函数逻辑
		//
	}

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        IList<Student> stu = new List<Student>() 
        {
          new Student(){ Id=1, Age=2, Sex=0, Name="嘻嘻",Label=new  string[]{"y","z","a"}},
          new Student(){ Id=2, Age=2,Sex=0, Name="嘻嘻",Label=new  string[]{"y","z"}},
          new Student(){ Id=3, Age=2,Sex=1, Name="嘻嘻",Label=new  string[]{"y","z"}},
          new Student(){ Id=4, Age=2, Sex=1,Name="嘻嘻",Label=new  string[]{"y","z","a"}},
          new Student(){ Id=5, Age=2,Sex=1, Name="嘻嘻",Label=new  string[]{"y","z","a"}},
          new Student(){ Id=6, Age=2,Sex=0, Name="嘻嘻",Label=new  string[]{"y","z"}},
          new Student(){ Id=7, Age=2,Sex=0, Name="嘻嘻",Label=new  string[]{"y","z"}},
          new Student(){ Id=8, Age=2, Sex=0,Name="嘻嘻",Label=new  string[]{"y","z","a"}}
        };
        JavaScriptSerializer js = new JavaScriptSerializer();
        context.Response.Write(js.Serialize(stu));
    }
}

  对应html模板为:

<script id="TemplateStudent" type="text/html">
<li>
        我的ID:<label>${Id}</label><br/>
        我的年龄:<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>
        我的姓名:<label>${Name}</label><br/>
        我的性别:{{if Sex==0}}<label class='sex${colorSex(Sex)}'>男</label>{{else}}<label class='sex${colorSex(Sex)}'>女</label>{{/if}}<br/>
        我的标签是:
        {{each(indexs,values) Label}}
       
        <label>${values} </label>
        
        {{/each}} 
        一共有${Label.length}个标签<br/>
        <input type="button"  value="点击我"  id="btnId${Id}" onclick="fashionB(${Id});"/>
        
</li>
</script>

  这就是配合使用each的方式来做了,此时如果你已经在你的电脑上面使用了这个each,你会发现其中有点小问题,就是这几个标签会紧挨着一起,可能你会在 <label>${values} </label>后面加上一个&nbsp; ,OK ,这样你认为没有问题了。看起来也很清楚了,但是可不代表其他人看起爽,让你再后面用逗号进行分割,此时你还可以接受,把&nbsp;换成 ,  ,但是一个新的问题出来了,每个<label>标签后面,永远是多了一个逗号,此时的你,遇到这种情况的话,就要在这个each里面加上if条件判断了,就是要处理这个多了一个逗号的问题.

{{each(indexs,values) Label}}
{{if indexs!=Label.length-1}}
<label>${values}, </label>
{{else}}
<label>${values} </label>
{{/if}}
{{/each}} 
 一共有${Label.length}个标签<br/>

问题解决了。

第四种方式(模板复用):

我们要把这个“我的标签”部分提取出来。单独声明一个<script> 标签进行装载

<script type="text/html" id="TemplateStudent2">
我的标签是:
{{each(indexs,values) Label}}
{{if indexs!=Label.length-1}}
<label>${values}, </label>
{{else}}
<label>${values} </label>
{{/if}}
{{/each}} 
一共有${Label.length}个标签<br/>
</script>

然后这里为了配合使用模板复合方式,我们要在之前的模板中改变一点点内容.

<script id="TemplateStudent" type="text/html">
<li>
        我的ID:<label>${Id}</label><br/>
        我的年龄:<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>
        我的姓名:<label>${Name}</label><br/>
        我的性别:{{if Sex==0}}<label class='sex${colorSex(Sex)}'>男</label>{{else}}<label class='sex${colorSex(Sex)}'>女</label>{{/if}}<br/>
        直接使用调用第二个模板,分离开来<br/>
        {{tmpl '#TemplateStudent2'}}
        <hr/>
       
        <input type="button"  value="点击我"  id="btnId${Id}" onclick="fashionB(${Id});"/>
        
</li>
</script>

{{tmpl '#TemplateStudent2'}} 中的tmpl关键字,是特定的,不能随意书写。后面则加在我们提取出来的第二个模板的ID



------------------------------------------------------------------------------------------------------
除了上述四种常用方式外,还有几种使用方式。在这里我就不一一列举了,因为我介绍的只是针对于Ajax提交之后的进行组合Json来使用这个模板插件
当然也可以单独是用这个插件,不在Ajax提交之后也可以。
此时的你,还蛋疼吗?
不管你疼不疼,反正我是不疼了。

 

posted @ 2013-01-22 14:09  K-Show  阅读(964)  评论(0编辑  收藏  举报