本文章主要介绍jquery插件中的treeview插件通过ajax异步从服务器上下载所需json字符串的实现,服务器端使用asp.net mvc实现。
treeview插件的官方demo地址:http://jquery.bassistance.de/treeview/demo/
实现步骤:
一、新建一JQueryTreeviewController,其默认的Index View内容如下:
<link rel="stylesheet" href="/Content/jquery.treeview.css" />
<script src="/Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.treeview.js" type="text/javascript"></script>
<script src="/Scripts/jquery.treeview.async.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#black").treeview({
url: '<%=Url.Action("GetMenuTree","JQueryTreeview") %>'
});
});
</script>
<h2>TreeViewIndex</h2>
<ul id="black" class="navigateFiletree">
</ul>
从以上代码中可以看出,获取此视图后,当页面就绪时将调用GetMenuTree action方法来获取treeview插件所需要的json字符串,并且自动生成树形。
注:代码中引用的js和css文件,在下载的treeview插件包中可以找到。
二、实现GetMenuTree action方法,代码如下:
public JsonStringResult GetMenuTree()
{
string sql = "SELECT [ModuleID],[SuperModuleID] FROM [SysModules]";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
DataTable dt = new DataTable();
SqlDataReader reader = cmd.ExecuteReader();
dt.Load(reader);
reader.Close();
conn.Close();
return this.JsonString(JQTreeHelper.GetJsonString(dt, "ModuleID", "ModuleID", "SuperModuleID", ""));
}
}
其 作用就是从数据库中读取出需要显示成树形的数据,并且调用JQTreeHelper来生成相应的json字符串,其返回结果中的 JsonStringResult 是自定义的一个result类,其作用基本与系统自带的JsonResult相同,只是输出文本时不再进行json序列化而已。
三、实现JQTreeHelper类,代码如下:
/// <summary>
/// jquery插件中的treeview控件的帮助类,用于生成treeview控件所需要的html代码结构
/// </summary>
public static class JQTreeHelper
{
public static List<JQTreeNode> GetJsonData(DataTable dtAllNodes,string idColumnName,string textColumnName,string parentIdColumnName,string rootNodeParentIdValue)
{
List<JQTreeNode> rootNodes = new List<JQTreeNode>();
DataView dvRootNodes = new DataView(dtAllNodes);
dvRootNodes.RowFilter = parentIdColumnName + "='" + rootNodeParentIdValue + "'";
foreach (DataRowView dv in dvRootNodes)
{
JQTreeNode node = new JQTreeNode();
if (dv[idColumnName] != DBNull.Value)
{
node.id = dv[idColumnName].ToString();
}
node.text = dv[textColumnName].ToString();
node.children = GetJsonData(dtAllNodes, idColumnName, textColumnName, parentIdColumnName, dv[idColumnName].ToString());
rootNodes.Add(node);
}
return rootNodes;
}
public static string GetJsonString(DataTable dtAllNodes, string idColumnName, string textColumnName, string parentIdColumnName, string rootNodeParentIdValue)
{
List<JQTreeNode> actual;
actual = GetJsonData(dtAllNodes, idColumnName, textColumnName, parentIdColumnName, rootNodeParentIdValue);
//序列化后,由于默认将所有字段都序列化输出,所以需要将没有赋值取默认值的字段替换为空,以此来减少输出的字符数
StringBuilder result = new StringBuilder();
new JavaScriptSerializer().Serialize(actual, result);
result.Replace("/"id/":null,", "");
result.Replace(",/"expanded/":false", "");
result.Replace(",/"hasChildren/":false", "");
result.Replace(",/"classes/":null", "");
result.Replace(",/"children/":null", "");
return result.ToString();
}
}
/// <summary>
/// jquery插件中的treeview控件进行ajax请求时返回的json数据对象
/// </summary>
public class JQTreeNode
{
/// <summary>
/// 树节点id
/// </summary>
public string id { get; set; }
/// <summary>
/// 树节点文本
/// </summary>
public string text { get; set; }
/// <summary>
/// 是否展开
/// </summary>
public bool expanded { get; set; }
/// <summary>
/// 是否有子节点
/// </summary>
public bool hasChildren { get; set; }
/// <summary>
/// cssclass类名称
/// </summary>
public string classes { get; set; }
/// <summary>
/// 子节点集合
/// </summary>
public List<JQTreeNode> children { get; set; }
}
到此代码就全部结束。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <mce:style type="text/css"><!-- .newStyle { border-style: dotted; border-width: 1px; text-align: center; } .newStyle1 { } #Text13 { width: 307px; } --></mce:style><style type="text/css" mce_bogus="1"> .newStyle { border-style: dotted; border-width: 1px; text-align: center; } .newStyle1 { } #Text13 { width: 307px; } </style> <div id="divIframe" title="类别信息"> <fieldset> <legend>类别</legend> <%-- <div style="WIDTH: 164px; HEIGHT: 196px;z-index:1; OVERFLOW: scroll;position:fixed; left:19px; bottom:363px; top:40px; border-top:solid;border-left:solid;">--%> <ul id="browser" class="filetree" style="float:left;margin:0;padding:0;WIDTH: 164px; HEIGHT: 196px; OVERFLOW: scroll;left:0px; bottom:0px; top:0px; border-top:solid;border-left:solid;"> <% List<TGProject.Models.TGSGAMESHOW> GameList = (List<TGProject.Models.TGSGAMESHOW>)ViewData["Game"]; foreach (TGProject.Models.TGSGAMESHOW game in GameList) { { %> <li class="closed" id="<%=game.GAMECODE%>"><span class="folder" onclick="javascript:loadDefine2('<%=game.GAMECODE%>')"> <%=game.GAMENAME%></span> <%--<ul> <li><span class="file"><%=game.GAMENAME%></span></li> </ul>--%> </li> <% } } %> <%-- <li class="closed"><span class="folder">Folder 2</span> <ul> <li class="closed"><span class="folder">Subfolder 2.1</span> <ul id="folder"> <li><span class="file">File 2.1.1</span></li> <li><span class="file">File 2.1.2</span></li> </ul> </li> <li><span class="file">File 2.2</span></li> </ul> </li> <li class="closed"><span class="folder">Folder 3 (closed at start)</span> <ul> <li><span class="file">File 3.1</span></li> </ul> </li> <li><span class="file">File 4</span></li>--%> </ul> <%-- </div>--%> <button style="float:left; position:relative; left:11%;top:5%;width: 52px">添加></button><br /> <button style="float:left; position:relative; top:40%;width: 52px"><删除</button> <select size="2" name="D1" style="height: 196px; width: 164px;overflow:hidden;float:right;"> <option value="1">1</option> <option value="1">1</option> <option value="1">1</option> <option value="1">1</option> </select> <br /> <br /> </fieldset> </div>
再在主页面调用
function LoadClass() { alert("test"); $("#divIframe").dialog("open"); } //弹出对话框的显示是独立的 $(function() { $("#divIframe").dialog({ width: 500, height: 300, show: 'drop', bgiframe: false, autoOpen: false, draggable: true, resizable: true, modal: true, dialogClass: "removeCloseBtn", closeOnEscape: false, position: 'top', buttons: { "查询": function(event, ui) { if ($("#tab4-account").is(":hidden")) { alert("打卡没有成功无法进行业务考核或您尚未选择“是”进行打卡和业务考核所以无法提交考核表单!"); return; } var assessid = "6,7,8,9,10,11,12,13,14,15,16,17"; var netbarid = $("#netNumber").html(); var point = $("input[name='rd1']:checked").val() + "," + $("input[name='rd2']:checked").val() + "," + $("input[name='rd3']:checked").val() + "," + $("input[name='rd4']:checked").val() + "," + $("input[name='rd5']:checked").val() + "," + $("input[name='rd6']:checked").val() + "," + $("input[name='rd7']:checked").val() + "," + $("input[name='rd8']:checked").val() + "," + $("input[name='rd9']:checked").val(); point = point + "," + $("input[name='rd10']:checked").val() + "," + $("input[name='rd11']:checked").val() + "," + $("input[name='rd12']:checked").val(); var username = ""; var atype; if (power == 6 || power == 5) atype = "1"; else if (power == 8) atype = "2"; rmark = $("#TextBox3").val(); if (rmark != "") { if (rmark != null) { if (rmark.indexOf("script") >= 0) { alert("备注含有非法字符!"); return; } } var demo = /^[/u0391-/uFFE5/w]+$/; if (!demo.test(rmark)) { } } else { if ($("input[name='rd3']:checked").attr("title") != "否") { alert("单项备注不能为空!"); return; } } } } }); $("#browser").treeview( { persist: "location", collapsed: true, unique: true, } ); }); function loadDefine2(index) { alert("test"); // $("#Gclass").empty(); // $('#test').html(''); // $('#test').html('<span id="test" style="color:#000000" mce_style="color:#000000"><select style=" width:226px;" mce_style=" width:226px;" name="class" id="Gclass" onchange="return;return class_onclick()" multiple="multiple"></select></span>'); $.ajax( { url: "http://" + location.host + "/ScoreQuery.aspx/loadDefine2/" + index, type: "POST", dataType: "json", success: loadSuccessed2 }); } function loadSuccessed2(result) { if (hasClass == 0) { if (result.rows.length > 0) { $.each(result.rows, function(i, item) { branches = $("<ul><li id=" + item.cell[0] + "><span class='file'>" + item.cell[1] + "</span></li></ul>").appendTo($("#" + item.cell[2])); $("#browser").treeview({ add: branches }); }); }//增加节点 hasClass = 1; } else { if (result.rows.length > 0) { $.each(result.rows, function(i, item) { branches = $("<ul><li id=" + item.cell[0] + "><span class='file'>" + item.cell[1] + "</span></li></ul>").appendTo($("#" + item.cell[2])); $("#browser").treeview({ del: branches }); });//删除节点 } hasClass = 0; } }
LoadClass是在查询按钮中调用该对话框,带树形和添加删除到select html中,然后点击某节点用each迭代出
$("#browser").treeview({
add: branches
});
其中hasClass是标记量判断是折叠还是展开的。