博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVVM架构~Knockoutjs系列之js接收C#数据集合的方式
阅读量:6713 次
发布时间:2019-06-25

本文共 2030 字,大约阅读时间需要 6 分钟。

在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());        });

怎么样,只是代码的位置不同,结果就完全不同吧,呵呵!所以说,我们对问题的理解程度,有时,应该有一种“模棱两不可”的精神!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Hudson可扩展持续集成引擎
查看>>
显示系统托盘列表(并执行隐藏与显示)
查看>>
codeforces Gargari and Permutations(DAG+BFS)
查看>>
定长内存池之BOOST::pool
查看>>
关于JDBC链接数据库的代码实现
查看>>
Linux命令-压缩解压命令:gzip、gunzip
查看>>
raspberry pi的网络配置
查看>>
jstring 和char 之间的转换方法
查看>>
可穿戴式智能设备,其潜在的安全问题?(上)
查看>>
ASP入门(九)-Request对象小案例
查看>>
PullToRefresh的个性化扩展
查看>>
分布式服务框架ZooKeeper
查看>>
【转】android gravity属性 和 weight属性
查看>>
ViewStub用法
查看>>
使用Texture2D创建Cubemap
查看>>
Jquery图片上传组件,支持多文件上传
查看>>
Server.xml配置解析
查看>>
线程笔记:Future模式
查看>>
Kali Linux渗透基础知识整理(二)漏洞扫描
查看>>
【转】【Mysql】MySQL添加用户、删除用户与授权
查看>>