BackBone结合ASP.NET MVC实现页面路由操作
1、 问题的背景
什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性。应用场景主要有页面操作过程中的添加收藏夹的操作、后退操作等过程中能完全恢复界面。
Html中window.history.pushState的出现实现了页面路由操作。由于操作比较复杂,我们采用backbone的封装的路由操作来实现下面的案例。
2、 实现目标
我们要实现的应用程序左侧导航,右侧展示数据。可以加入收藏夹,可以回退,恢复和回退时可以完全恢复现场。
这个程序的逻辑思路为按照班级筛选学生
程序截图如下

当程序加载时我们观察浏览器栏的变化
http://localhost:56968/#searchByClassCode/all
当我们点击导航【三年一班】时,我们观察浏览器栏的变化
http://localhost:56968/#searchByClassCode/0301
我们发现浏览器栏里的数据变为0301
如图所示

当我们点击【三年二班】,我们观察浏览器栏的变化
http://localhost:56968/#searchByClassCode/0302
我们发现浏览器栏里的数据变为0302
如图所示

当我们点击后退时,我们观察浏览器栏的变化
http://localhost:56968/#searchByClassCode/0301
我们发现浏览器栏里的数据变为0301

我们总结出下面的结论
1、将http://localhost:56968/#searchByClassCode/0301加入收藏夹,当点击收藏夹时,能完整的还原现场。
2、点击后退时能退回到【三年一班】
3、整个过程都是异步刷新,没有同步刷新。
3、 实现的工具和材料
VS2010+MVC4+Backbone.js。必须要装MVC4
4、 实现整体过程
1、新建mvc项目
在model文件夹 新建Student的类,定义如下
public class Student
{
#region 学号
/// <summary>
/// 学号
/// </summary>
public string Number
{
get;
set;
}
#endregion #region 姓名
/// <summary>
/// 姓名
/// </summary>
public String Name
{
get;
set;
}
#endregion #region 班级
/// <summary>
/// 班级
/// </summary>
public String ClassName
{
get;
set;
}
#endregion #region 班级编码
/// <summary>
/// 班级编码
/// </summary>
public string ClassCode
{
get;
set;
}
#endregion
2、 新建HomeController
里面的两个路由地址分别为Index和GetList。其中Index用于显示页面
GetList用于提供数据服务,其中classCode为班级代码,用于查询某个班级下的学生,如果参数值为空或all就取所有的,否则就按照编码检索,返回值数据为json数据
实现如下
public class HomeController : Controller
{
/// <summary>
/// 主页
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
return View();
}
/// <summary>
/// 获取数据
/// </summary>
/// <param name="classCode"></param>
/// <returns></returns>
public ActionResult GetList(string classCode)
{
string content = new StreamReader(Server.MapPath("~/Content/Data/Student.json")).ReadToEnd();
List<Student> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Student>>(content);
if (!string.IsNullOrEmpty(classCode))
{
if (classCode != "all")
{
list = list.Where(item => item.ClassCode == classCode).ToList();
}
}
return new JsonResult()
{
Data = list,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
为了方便数据的提供服务采用json文件的方式,并没有采用关系型数据库,数据如下:
[{
    "Number": "000001",
    "Name": "学生1",
    "ClassName": "三年一班",
    "ClassCode": "0301"
},
{
    "Number": "000002",
    "Name": "学生2",
    "ClassName": "三年二班",
    "ClassCode": "0302"
},
{
    "Number": "000003",
    "Name": "学生3",
    "ClassName": "三年三班",
    "ClassCode": "0303"
},
{
    "Number": "000004",
    "Name": "学生4",
    "ClassName": "三年四班",
    "ClassCode": "0304"
},
{
    "Number": "000005",
    "Name": "学生5",
    "ClassName": "三年一班",
    "ClassCode": "0301"
},
{
    "Number": "000006",
    "Name": "学生6",
    "ClassName": "三年二班",
    "ClassCode": "0302"
},
{
    "Number": "000007",
    "Name": "学生7",
    "ClassName": "三年三班",
    "ClassCode": "0303"
},
{
    "Number": "000008",
    "Name": "学生8",
    "ClassName": "三年四班",
    "ClassCode": "0304"
},
{
    "Number": "000009",
    "Name": "学生9",
    "ClassName": "三年一班",
    "ClassCode": "0301"
},
{
    "Number": "000010",
    "Name": "学生10",
    "ClassName": "三年二班",
    "ClassCode": "0302"
},
{
    "Number": "000011",
    "Name": "学生11",
    "ClassName": "三年三班",
    "ClassCode": "0303"
},
{
    "Number": "000012",
    "Name": "学生12",
    "ClassName": "三年四班",
    "ClassCode": "0304"
},
{
    "Number": "000013",
    "Name": "学生13",
    "ClassName": "三年一班",
    "ClassCode": "0301"
},
{
    "Number": "000014",
    "Name": "学生14",
    "ClassName": "三年二班",
    "ClassCode": "0302"
},
{
    "Number": "000015",
    "Name": "学生15",
    "ClassName": "三年三班",
    "ClassCode": "0303"
},
{
    "Number": "000016",
    "Name": "学生16",
    "ClassName": "三年四班",
    "ClassCode": "0304"
},
{
    "Number": "000017",
    "Name": "学生17",
    "ClassName": "三年一班",
    "ClassCode": "0301"
},
{
    "Number": "000018",
    "Name": "学生18",
    "ClassName": "三年二班",
    "ClassCode": "0302"
}]
3、 后台数据服务实现好了,我们定义Backbone的路由服务
根据之前浏览器栏的地址的数据
http://localhost:56968/#searchByClassCode/0301
http://localhost:56968/#searchByClassCode/0302
http://localhost:56968/#searchByClassCode/all
我们定义下面的路由
searchByClassCode/:code
searchByClassCode/
对应的处理函数为getData。其中 :code为编码。
学生通过列表导航传入这些值。
<ul id="ulNav">
<li>
<a href="#searchByClassCode/all">全部</a>
</li>
<li>
<a href="#searchByClassCode/0301">三年一班</a>
</li> <li>
<a href="#searchByClassCode/0302">三年二班</a>
</li> <li>
<a href="#searchByClassCode/0303">三年三班</a>
</li>
<li>
<a href="#searchByClassCode/0304">三年四班</a>
</li> </ul>
路由的实现如下
 var Route = Backbone.Router.extend({
        routes: {
            "searchByClassCode/:code": "getData",
            "searchByClassCode/": "getData"
        },
        getData: function (code) {
            stuCollection.fetch({ reset: true, data: { classCode: code} });
                $('#ulNav li').each(function (index, item) {
                    if ($(item).find("a[href$='" + code + "'").length > 0) {
                        $(this).find("a").addClass('liSelected');
                    }
                    else {
                        $(this).find("a").removeClass('liSelected');
                    }
                });
        }
    });
4、 路由服务定义完毕,需要把数据展示展示出来。Backbone的模型和列表
    var StuModel = Backbone.Model.extend({
        Number: "",
        Name: "",
        ClassName: ""
    });
    var StuCollection = Backbone.Collection.extend({
        model: StuModel,
        url: "/home/GetList"
    });
5、 我们实例化模型,监控模型的变化。
  var stuCollection = new StuCollection();
    var DataContentView = Backbone.View.extend({
        el: "#divContent",
        template: _.template($("#stuItem").html()),
        initialize: function () {
            this.$tableView = this.$('#tableView');
            this.listenTo(stuCollection, 'reset', this.AddAll)
        },
        AddAll: function () {
            this.$tableView.find("tbody").html("");
            stuCollection.each(this.AddOne, this);
        },
        AddOne: function (stu) {
            var a = $(this.template(stu.toJSON()));
            a.on("click", function () {
                if ($(this).is('.select')) {
                    $(this).removeClass("select")
                }
                else {
                    $(this).addClass("select")
                }
            })
            this.$tableView.find("tbody").append(a);
        }
    });
其中展示部分的表格
<table id="tableView" cellpadding="5" cellspacing="5" style=" overflow:auto">
<thead>
<tr> 
<th>
学号
</th>
<th>
姓名
</th>
<th>
班级
</th>
</tr>
</thead>
<tbody></tbody>
</table>
定义的模板为
<script type="text/template" id="stuItem">
<tr>
<td><%= Number%></td>
<td><%= Name%></td>
<td><%= ClassName%></td>
</tr>
</script>
BackBone结合ASP.NET MVC实现页面路由操作的更多相关文章
- 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面
		在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ... 
- 【翻译】ASP.NET MVC 5属性路由(转)
		转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ... 
- 为ASP.NET MVC应用添加自定义路由
		这里,我们将学习如何给asp.net mvc应用添加自定义路由.用自定义路由来修改默认路由表. 对一些简单的asp.net mvc应用,默认的路由表就已经足够了.但是,当你需要创建特殊的路由时,就需要 ... 
- 第2章 ASP.NET MVC(URL、路由及区域)
		* { font: 17px/1.5em "Microsoft YaHei" } ASPNET MVC URL.路由及区域 一.URL.路由及区域 一. 配置路由器 1. ... 
- 学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面
		在上一篇文章中我们已经创建了实体类,在这一篇文章中,我将创建一个新的控制器类——BookController,使用BookController对Books表中的数据进行CURD操作的方法,并使用视图模 ... 
- Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index
		http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ... 
- ASP.NET MVC 的URL路由介绍
		在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ... 
- ASP.NET MVC学习之路由篇(3)
		根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ... 
- ASP.NET MVC学习之路由篇(1)
		1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ... 
随机推荐
- HSQL可视化工具
			本地使用HSQL数据库进行开发,多是集成在开发工具的内部,比如studio,往往看不到HSQL数据库,那么如何查看HSQL数据库呢? 可以使用hsql自带的可视化工具,运行hsqldb-*.jar 包 ... 
- windows 系统无法安装
			1. 提示windows 无法安装到这个磁盘,选中的磁盘具有MBR分区表. Windows cannot be installed to this disk.the selected disk has ... 
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
			[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ... 
- 【Luogu4921】情侣?给我烧了!(组合计数)
			[Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ... 
- [CTSC2018] 假面 | 期望 DP
			题目链接 LOJ 2552 Luogu P4564 考场上这道题我先是写了个70分暴力,然后发现似乎可以NTT,然鹅问题是--我没学过NTT,遂脑补之,脑补出来了,下午出成绩一看,卡成暴力分(70)- ... 
- luogu4268 Directory Traversal (dfs)
			题意:给一个树状的文件结构,让你求从某个文件夹出发访问到所有文件,访问路径字符串长度之和的最小值,其中,访问父节点用..表示,两级之间用/分割 做两次dfs,第一次算DownN[x]和DownS[x] ... 
- numpy random
			np.random.seed()用法: np.random.seed(5) print(np.random.permutation(np.array([i for i in range(9)]))) ... 
- 面试 -- Http协议相关(转载)
			http请求由三部分组成,分别是:请求行.消息报头.请求正文 HTTP(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接 ... 
- Ubuntu 13.04下构建Qt5开发环境
			虽然Qt命运多舛,但是也阻挡不了程序员对它的喜爱.经历了一系列波折之后,现在到在芬兰公司Digia手中,Qt又将迎来一个发展.Qt5就是在这种情况之下发布的.正值Ubuntu刚刚发布了13.04版,我 ... 
- 【POJ2248】加法链 idfs
			首先,在这道题的搜索框架中,在对每一位进行枚举时,复杂度为\(O(n^2)\),但是可知最优解序列的长度不会太长. 其次,采用 \(bool\) 类型返回值时,是一种存在性搜索,并不一定能够得到最优解 ... 
