MVVM架构~Knockoutjs系列之js接收C#数据集合的方式
在controller里将数据拿到,并且存储到ViewBag对象里,最后在View上显示出来,这是传统的MVC开发方式,事实上引入Knockoutjs以后,这种方式还是适合的,Knockoutjs只是在前台数据绑定中做了一点调整,它不在依赖于后台具体数据,你完全可以在
最后去为它动态绑定数据,一般地,我们会为这种页面添加一个JS文件,用来获取数据,以实现前台开发人员与后台代码开发人员的分离。
从view层拿数据的方式有两种,第一是通过ViewBag,ViewData,TempData,Model等容器来存储,然后在View上直接取即可,而第二种方式是通过一个GET请求,它通常是异步的,你可以使用JQ里的getJSON,它可以方便的实现数据的获取工作,它对集合的支
持是比较好的。
方式一,通过ViewBag等容器实现的集合
var json =@Html.Raw(Json.Encode(ViewBag.Category));
这时,json变量已经是一个Json数组了,它将C#里的IEnumable集合转换成了JSON对象
方式二,通过getJSON等方式实现异步获取
注意,异步执行,它的意思是说,你的页面在一个ajax请求时,不会去等待它,而是直接执行下面的语句,这样,对于大数据量情况下,浏览器不会假死,用户体验会好一些,但有时,开发人员在写代码时,往往会掉到AJAX的陷阱中,看下面代码:
$.getJSON("http://localhost:2166/api/values/", function (data) {
var Cart = function () {
// Stores an array of lines, and from these, can work out the grandTotal
var self = this;
//self.lines = ko.observableArray([new CartLine()]);
self.lines = ko.observableArray(data);
// Operations
self.addLine = function () { self.lines.push(new CartLine()) };
self.removeLine = function (line) { self.lines.remove(line) };
}
});
ko.applyBindings(new Cart());
不仔细看,看不出问题,但一运行程序,问题就出来了,“从服务器那边获取不到数据”,这是为什么呢,明明有数据呀,这就是AJAX的陷阱了,你的 ko.applyBindings(new Cart())没有等待上面的取数据完,就输出了,所以,什么都没有,下面是正常的代码
你可以对比一下:
$.getJSON("http://localhost:2166/api/values/", function (data) {
var Cart = function () {
// Stores an array of lines, and from these, can work out the grandTotal
var self = this;
//self.lines = ko.observableArray([new CartLine()]);
self.lines = ko.observableArray(data);
// Operations
self.addLine = function () { self.lines.push(new CartLine()) };
self.removeLine = function (line) { self.lines.remove(line) };
}
ko.applyBindings(new Cart());
});
怎么样,只是代码的位置不同,结果就完全不同吧,呵呵!所以说,我们对问题的理解程度,有时,应该有一种“模棱两不可”的精神!
MVVM架构~Knockoutjs系列之js接收C#数据集合的方式的更多相关文章
- MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...
- MVVM架构~Knockoutjs系列之验证机制的引入
返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...
- MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
返回目录 为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好 ...
- MVVM架构~Knockoutjs系列之text,value,attr,visible,with的数据绑定
返回目录 Knockoutjs是微软mvc4里一个新东西,用这在MVC环境里实现MVVM,小微这次没有大张旗鼓,而是愉愉的为我们开发者嵌入了一个实现MVVM的插件,这下面的几篇文章中,我和大家将一起去 ...
- MVVM架构~Knockoutjs系列之对象与对象组合
返回目录 在面向对象的程序设计里,对象是核心,一切皆为对象,对象与对象之间的关系可以表现为继承和组合,而在Knockoutjs或者JS里,也存在着对象的概念,今天主要说一下JS里的对象及对象的组合. ...
- MVVM架构~knockoutjs系列之正则表达式使规则更灵活
返回目录 几乎每种验证架构都会有正则表达式的加盟,一般地,一种验证架构首先会提供一些标准的,常用的验证规则,它们通常是数字验证,电话验证,email验证,长度验证,范围验证,日期验证等,而如果使你的验 ...
- MVVM架构~knockoutjs系列之级联select
返回目录 对于下拉列表框的绑定在之前的knockoutjs文章中已经介绍过,今天主要说一下级联的select,事实上,在knockoutjs里,是以数据绑定为中心的,而数据是以面向对象为前提的,而对于 ...
- MVVM架构~knockoutjs系列之包括区域级联列表的增删改
返回目录 这个例子我做了几次,之前总是有BUG,目前测试后,确定没有BUG才发上来的,主要功能是实现“我的银行”模块的增删改的功能,这个里面包括了级联列表的区域选择,这部分是难点,在开发过程中,我们应 ...
随机推荐
- Microsoft.Office.Interop.Word.Document.Open returns null on Windows Server 2008 R2
系统终于通过UAT,可以上线了.一遍测下来还行,可是为什么word转PDF就是不行呢?查了一下log,原来在wordApp.Documents.Open来打开生产的word文件的时候,返回一直是空.之 ...
- Codeigniter 在Active Record中限制批量更新数目
今天手头电商项目有个需求是:将订单中的优惠券自动发放给买家,所以要只更新优惠券表中的某几行数据,查了手册和网络都没有解决办法. 一开始用循环和遍历来做都是错的,因为update语句一下就更新掉所有符合 ...
- Qt MVC(模型-视图-代理)
实习刚才是一段时间,公司这边就要求熟悉这个mvc.一般开始都是用tableview,前面的blog我都是使用listview居多,并且相对delegate这个使用的多余model.接下来说下model ...
- BZOJ1261: [SCOI2006]zh_tree
Description 张老师根据自己工作的需要,设计了一种特殊的二叉搜索树.他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,-,n),其中数字1, ...
- PD4F将HTML转换为PDF乱码问题
修改pd4fonts.properties文件如下: KaiTi_GB2312=SIMKAI.TTFSimSun=SIMKAI.TTF
- 【ImageView】ImageView点击事件报错空指针
今天在使用自定义圆形imageview的时候,想利用其点击事件来实现查看个人资料功能,但是该空间在Activity中的onCreate方法中调用点击事件总是出现空指针异常,每次程序都进不去主页面,到处 ...
- 编写可维护的JavaScript
第一章 1.基本的格式化 1.1推荐使用Tab键插入4分字符 1.2语句结尾要使用分号 1.3一行的长度最好不要超过80个字符 1.4通常在运算符后换行,下一行增加2个层级的缩进 1.5推荐在以下场景 ...
- android.util.TypedValue.applyDimension
先看一个例子: int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, context.getResourc ...
- 用js实现瀑布流的一种简单方法
现在说瀑布流式布局似乎有点晚了,但是每一项技术都是向着“精”和“简”的方向在不断发展,在发展到极致之前,需要一个相当漫长的过程,因此,从这个角度来说,当瀑布流被应用得越来越多的时候,反而更应该讨论它, ...
- 安卓模拟器的报错This AVD's configuration is missing a kernel file!!
安卓模拟器的报错: 可能的原因是target设置问题: