C#与JavaScript通过隐藏控件协同操作JSON对象

作者:开源拾贝时间:2026-10-26 17:07:48浏览:209

本文介绍一种通过客户端隐藏控件实现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);
作者最新文章