当前位置: 首页 > news >正文

【ASP.NET MVC】数据到客户端(7)

前文ViewBag数据在服务端动态生成页面,也可以传到客户端浏览器供JS使用。

一、数据从控制器到客户端

前文介绍,动态生成页面时,控制器的数据 并没有传递到 客户端,而是给自己来用,生成View 再利用http传递到客户端浏览器。

当然数据也是可以传递给客户端的,但有需要先搞明白传递到客户端的 数据 给谁用?谁能够使用这些数据? 答案很简单: JS   (JavaScript ) ,其他的JQuery 等可以视为对JS的包装,也可以在客户端 “动起来” 

传递方法:

1、直接用 HTML 的元素的 属性来进行数据来传递(样式设置为 style="display:none" ,不显示该元素)

参考代码:

页面

<input id="test" style="display:none" value='@ViewBag.data'/>
<script>window.onload = function () {alert(document.getElementById("test").value);}
</script>

控制器里添加:

  ViewBag.data = "Just test!";

思路比较简单,服务器生成页面的时候 取 ViewBag 数据,并将数据赋值给id 为test 的 input 元素的 属性value ,传递到客户端后,JS转载,在页面加载完成后 ( window.onload ),自动执行代码 alert(document.getElementById("test").value);  

2、直接在JS代码中传数据

比第一种方法更简单的是在JS代码中值贴数据,JS代码也是控制器生成的! 代码如下:

<script>var msg = '@ViewBag.data';window.onload = function () {alert(msg);}
</script>

要理解,var msg = '@ViewBag.data';  这行也是在服务端生成的!所ViewBag可以使用。

var msg = @ViewBag.data; 语法错误,记得带(单双)引号。

二、数据类型

以上可以解决数据传递到浏览器,但是数据类型也是需要解决的问题——数据类型肯定不限于简单的值类型,肯定还有其它复合数据类型,比如集合类型?组合类型?

例:Echarts用来绘制图形的数据就很可能是一系列的数据(X轴,Y轴),对应就是集合类型的数据。

服务器与客户端数据传递数据,目前而言,比较通用的是JSON——搞明白它的用途,理解JSON就并不难了

JSON就是用一种指定 方式来让数据保持它原有的类型信息。网络传输使用的是字节流:什么面向对象、集合类型、甚至是普通的整数、浮点数都没有!就是一堆字节(八位二进制),那么肯定需要一种方法来对数据进行“补充”说明,以此来解释传送过来的一堆字节流!

JSON补充一些符号,比如双引号(“”),括号(中括号、大括号)、逗号等,通过嵌套组合来描述数据之间的关系。

其实最主要的就两种结构: 集合与组合,值得注意的是它们两可以相互嵌套,如:传送一个学生集合,学生又包括了姓名、年龄等(组合类型),而且学生还包括选修的课程列表,组合的学生类型里又包括了一个选修课的集合类型!

以上比较繁琐地分析JSON的用途。

1、服务端使用JSON

可以使用C#以及其他扩展包提供的JSON操作函数来实现数据“序列化"——JSON把特定涵义的数据变成字节流,传递到客户端后,再按照JSON格式进行解释,完美!

方法很多:

JavaScriptSerializer 法

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using TestWeb.Models;namespace TestWeb.Controllers
{public class HomeController : Controller{//// GET: /Home/public ActionResult Index(){DataSet set= TestMysql.Query("select * from user");List<TestUser> list = new List<TestUser>();foreach (DataRow row in set.Tables[0].Rows){TestUser tmp = new TestUser(row["name"].ToString(), row["psw"].ToString(), int.Parse(row["age"].ToString()));list.Add(tmp);}ViewBag.stu_list = list;JavaScriptSerializer jss = new JavaScriptSerializer();ViewBag.data = jss.Serialize(list);return View();}}public class TestUser{public string name;public string psw;public int age;public TestUser(string _name, string _psw, int _age){name = _name;psw = _psw;age = _age;}}
}

页面:

<script>var msg = '@Html.Raw(ViewBag.data)';window.onload = function () {alert(msg);}
</script>

运行结果

要注意使用@Html.Raw 函数,页面如果改成:

<script>var msg = '@ViewBag.data';window.onload = function () {alert(msg);}
</script>

则运行结果为:

 很显然,对双引号的解释出了问题。

服务器JSON还有其他方法如:JSON.NET 和  扩展包Newtonsoft.Json

 ViewBag.data = JsonConvert.SerializeObject(list);

2、客户端JS使用JSON

代码:

<script>var msg = JSON.parse('@Html.Raw(ViewBag.data)');window.onload = function () {for (var i = 0; i < msg.length; i++) {alert("姓名:"+msg[i].name +" 年龄:"+msg[i].age +" 密码:"+msg[i].psw);}}
</script>

效果:

 很显然,浏览器对服务器传递的JSON字节流进行了正确的解释。

问题:

客户端是否可以将数据JSON序列化,传递到服务端控制器进行解释?当然可以,后续再探讨。

http://www.lryc.cn/news/109675.html

相关文章:

  • InnoDB有哪些特性
  • 【linux--->数据链路层协议】
  • 如何在pytest接口自动化框架中扩展JSON数据解析功能?
  • 哪些年,我们编程四处找的环境依赖
  • 物联网工程开发实施,应该怎么做?
  • mysql使用SUBSTRING_INDEX拆分字符串,获取省、市、县和详细现住址
  • Kubernetes中的就绪(readinessProbe)和存活(livenessProbe)探针
  • docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)
  • 俄罗斯方块
  • web服务
  • 【Rust 基础篇】Rust类型别名:为类型赋予新的名字
  • 【机器学习】 贝叶斯理论的变分推理
  • Flink之RedisSink
  • STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯
  • 睿讯微带你深度了解汽车交流充电桩
  • word怎么压缩到10m以下?文件压缩很简单
  • I.MX6ULL_Linux_驱动篇(43)linux通用LED驱动
  • OPTEE之sonarlint静态代码分析实战二——optee_client
  • c++调用ffmpeg api将视频文件内容进行udp推流
  • 助力工业物联网,工业大数据之服务域:油站主题分析【二十六】
  • MySql之索引
  • adb调试
  • ElasticSearch_学习笔记
  • Portraiture 4.0.3 for windows/Mac简体中文版(ps人像磨皮滤镜插件)
  • Java精品项目源码第152期火车票预订系统(编号M062)
  • 嵌入式软件C/C++(技术面试题)
  • Idea中侧面栏不见了,如何设置?
  • 构建高效读写分离MySQL主从复制架构,应对高可用挑战!
  • Stable Diffusion系列课程二:ControlNet
  • 【css】使用float实现水平导航栏