JavaScript 通过 AJAX 修改 Session 的实现方案
本文介绍如何利用 JavaScript 结合 AJAX 技术修改服务器端 Session 数据。核心思路是通过客户端发起异步请求,调用实现了 IRequiresSessionState 接口的服务端一般处理程序(.ashx),从而在保持页面不刷新的情况下更新 Session 变量。文中提供了完整的 C# 服务端代码与兼容多浏览器的 JS 客户端实现,并对比了字符串拼接与 Repeater 控件生成菜单的优劣。
JavaScript 修改 Session 的核心思路
看到标题可能会产生疑问:JavaScript 运行在客户端,而 Session 存储在服务器端,两者如何交互?
首先明确需求:在权限管理模块中,点击特定模块时需更新 Session 中的模块代号。该操作由一个 a 标签触发。虽然 LinkButton 可能同时具备页面跳转和修改 Session 的功能,但此处暂不深究,若有相关 Demo 欢迎留言补充。
a 标签负责页面跳转,其 onclick 事件执行当前页面的 JS 方法。因此,核心问题转化为:如何编写一个 JavaScript 方法,通过异步方式修改服务器端的 Session。
此例虽简单,但对作者意义重大,它消除了一部分对 AJAX 技术的恐惧感。
服务端一般处理程序实现
第一步是编写服务端的一般处理程序(.ashx)。
需要注意的是,若要修改 Session,必须额外引入命名空间并实现特定接口(无需实现其他方法)。
服务端代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
namespace TGB.CJX
{
/// <summary>
/// 修改Session
/// </summary>
public class ModifySession : IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Session["modelID"]=context.Request.QueryString["session"].ToString();
//context.Session["modelID"] = "1";
//context.Response.Write(context.Session["modelID"]);
}
public bool IsReusable
{
get
{
return false;
}
}
}
} 上述功能实现看似简单。
客户端 AJAX 调用代码
接下来是客户端代码。
客户端代码如下:
var xmlhttp;
var session;
function submit(obj) {
//session = obj.id.substr(1, 1);
session = obj.id.replace("model","");
//IE7,IE8,FF,MOZILLA,SAFARI
if (window.XMLHttpRequest) {
//alert("IE7,IE8,FF,MOZILLA,SAFARI");
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMinmeType) {
xmlhttp.overrideMinmeType("text/xml");
}
} else if (window.ActiveXObject) {
//alert("IE5,IE6");
var activeName = ["MSXML2.XMLHTTP", "Miscrosoft.XMLHTTP"];
for (var i = 0; i < activeName.length; i++) {
try {
xmlhttp = new ActiveXObject(activeName[i]);
break;
} catch (e) {
return;
}
}
}
if (xmlhttp == undefined || xmlhttp == null) {
alert("当前浏览器不支持创建XMLHTTPREQUEST对象,请更换浏览器");
return;
}
xmlhttp.onreadystatechange = callback;
xmlhttp.open("GET", "ModifySession.ashx?session=" + session, true);
xmlhttp.send(null);
}
function callback() {
//判断和服务器的交互是否完成,还要判断服务器端是否返回了数据
if (xmlhttp.readyState == 4) {
//表示和服务器端的交互完成
if (xmlhttp.status == 200) {
//alert("正确返回了数据");
return;
}
}
} 回调函数中仅保留了一条测试正常返回数据的语句,后续已注释。
菜单生成的字符串拼接与 Repeater 对比
在为 a 标签绑定事件时,最初采用字符串拼接方法:从数据库查询模块 ID 和名称,通过语句拼接生成 HTML。
拼接代码如下:
StringBuilder sbModel = new StringBuilder();
//将可以访问的模块进行菜单拼接
for (int i = 0; i < dtModel.Rows.Count; i++)
{
sbModel.Append("<li><a id='model" + dtModel.Rows[0]["mdlID"].ToString() + "' href='SpaceWeb.aspx' target='_parent' runat='server' onclick='submit(this)'>" + dtModel.Rows[i]["mdlName"].ToString() + "</a></li>");
} 这种写法容易出错。尽管在引入前写过测试语句并将变量写入指定位置,但生成的代码难以调试。
经交流得知 Repeater 控件,恍然大悟:重复生成的过程正是 Repeater 的功能。既然控件能完成,何必编写易错的代码?
Repeater 代码如下:
<asp:Repeater runat="server" id="rptModel">
<ItemTemplate>
<li><a id='model'+'<%#Eval("mdlID")%>' href="SpaceWeb.aspx" target="_parent" runat="server" onclick="submit(this)"><%#Eval("mdlName" %></a></li>
</ItemTemplate>
</asp:Repeater> 这样写是否更清晰?之前使用字符串拼接虽已实现,但改用 Repeater 仅为提供一种思路。id 拼接处可能存在隐患,如有问题欢迎指正。
至此,第一篇关于 AJAX 的文章完成。对 AJAX 的理解仅是开始,本例未涉及复杂数据交互,部分知识解释尚显单薄。随着学习深入,AJAX 应用不会局限于 UpdatePanel 和 Timer 等控件。对于难度适中的实例,自行实践效果更佳。
有人可能问:使用 LinkButton 即可实现,为何如此麻烦?起初我也未想到 LinkButton 能解决,是自己将问题复杂化了。涉及页面跳转时,完全可用 LinkButton 解决。但学习是一个过程,通过这个小失误促进了对 AJAX 的理解,何尝不是一件乐事。
对 AJAX 的理解仍在进行中,如有错误,欢迎评论指正。
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
