C#与JavaScript通过隐藏控件协同操作JSON对象
本文介绍一种通过客户端隐藏控件实现C#服务端与JavaScript客户端共享同一JSON数据对象的方法。核心思路是将泛型列表序列化为JSON存入服务器端隐藏控件,利用该控件在页面回传时保持数据状态。前端通过jQuery读取并修改JSON,后端在Page_Load中反序列化获取最新数据,从而确保两端操作的数据一致性。
C#与JavaScript通过隐藏控件协同操作JSON对象
要实现客户端与服务端操作同一JSON对象,目前可行的方案是利用客户端隐藏控件来传递和存储数据。
假设存在一个泛型列表对象 List<TrainingImplement>,将其转换为JSON格式后,需要探讨如何在客户端和服务端分别对该数据进行读写操作。
JSON与C#泛型转换实现
首先实现JSON对象与C#泛型之间的相互转换逻辑。
具体实现代码如下:
//将json数据转换为泛型
public static T ConvertByteDataToObject<T>(string byteData)
{
T obj;
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(byteData)))
{
var serializer = new DataContractJsonSerializer(typeof(T));
obj = (T)serializer.ReadObject(ms);
}
return obj;
}
//将泛型转换为json
public static string ConvertObjectToByteData<T>(T obj)
{
string result;
using (var ms = new MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(ms, obj);
ms.Position = 0;
result = Encoding.UTF8.GetString(ms.ToArray());
}
return result;
} 隐藏控件存储与页面配置
其次,将生成的JSON数据源存储到客户端的隐藏控件中。
HTML代码如下:
<input type="hidden" id="hideDataSource" runat="server" /> 需要注意的是,当JSON数据中包含反斜杠等字符时,可能会触发ASP.NET的Request验证错误。因此,需要在页面指令中设置 ValidateRequest="false" 以禁用该验证。
页面指令代码如下:
<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" 服务端Page_Load数据初始化与回传处理
在页面加载事件 Page_Load 中,负责初始化或从客户端读取JSON数据源。
后端处理代码如下:
protected void Page_Load(object sender, EventArgs e)
{
#region 加载数据源
if (!IsPostBack)
{
List<TrainingImplement> list= new List<TrainingImplement> (){
new TrainingImplement (){
Code="aaa",
c_name ="bbb"
}
....
};//初始化数据源
hideDataSource.Value = ConvertObjectToByteData(list);
}
else
{
//如果是回传,数据源从客户端读取
List<TrainingImplement> list = ConvertByteDataToObject<List<TrainingImplement>>(hideDataSource.Value);
hideDataSource.Value = ConvertObjectToByteData(list);
}
#endregion 客户端JavaScript操作示例
最后,展示如何在客户端通过JavaScript操作该JSON数据源。
前端脚本代码如下:
<script type="text/javascript" src="../Scripts/jquery-1.4.3.js"></script>
<script type="text/javascript" src="../Scripts/jquery-ui-1.8.7.custom.min.js"></script>
<script type="text/javascript" src="../Scripts/jquery.json-2.2.min.js"></script>
<script type ="text/javascript" >
var DataSourceHidName = "hideDataSource";
var dataSourceDom;
var dataSourceJson;
$(document).ready
(function () {
//获取数据源
dataSourceDom = document.getElementById(DataSourceHidName);
dataSourceJson = eval("(" + dataSourceDom.value + ")");
});
//修改第1个TrainingImplement对象的Code值示例方法
function ModifiedCode() {
dataSourceJson[0]._code = "Code001";
//将更新值后的json对象重新写入隐藏控件中
dataSourceDom.value = $.toJSON(dataSourceJson);
}
</script> 在服务端C#中操作Json数据源时,只需从隐藏控件读取值并反序列化为泛型列表即可。
后端读取代码如下:
List<TrainingImplement> list = ConvertByteDataToObject<List<TrainingImplement>>(hideDataSource.Value);JS 怎么使用 pako.js 解压 gzip 数据流
2026-11-05 15:54:33
零基础先学JavaScript还是Python?对比学习难度与上手曲线
2026-11-05 14:47:40
JS代码反混淆:主流在线工具与本地软件推荐
2026-11-04 19:28:41
浏览器控制台查看格式化JSON有哪些实用技巧
2026-11-04 16:56:53
JS控制台打印基础:console.log语法与多参数用法
2026-11-04 09:23:11
