JavaScript控制Session操作方法
更新時(shí)間:2013年01月17日 09:04:54 作者:
JavaScript代表客戶端,而Session代表的是服務(wù)器(不知道這樣說(shuō)大家是否能夠理解)接下來(lái)介紹JavaScript如何控制Session,感興趣的朋友可以了解下啊
看到這個(gè)題目,或許有人會(huì)提出疑問(wèn),JavaScript代表客戶端,而Session代表的是服務(wù)器(不知道這樣說(shuō)大家是否能夠理解)。
先說(shuō)一下需求,我在做一個(gè)權(quán)限管理的時(shí)候,需要在點(diǎn)擊某個(gè)模塊時(shí),Session中相應(yīng)的改變模塊代號(hào),而實(shí)現(xiàn)這個(gè)操作的是一個(gè)a標(biāo)簽,當(dāng)然我不知道 一個(gè)linkbutton是否可以同時(shí)將跳轉(zhuǎn)頁(yè)面和修改Session做了,個(gè)人感覺(jué)應(yīng)該是可以的,具體能不能,如果有人做了Demo可以留言說(shuō)明。
a標(biāo)簽,實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn),他的onclick事件,執(zhí)行的也是本頁(yè)面中的js方法,現(xiàn)在就回到了題目所描述的問(wèn)題——寫一個(gè)JavaScript方法,使其修改Session。
其實(shí)這個(gè)例子不難,但是對(duì)我個(gè)人的意義卻非同尋常,這個(gè)例子解除了我一大部分對(duì)AJAX的恐懼。
首先,是寫一個(gè)一般處理程序(也就是服務(wù)端代碼)
需要說(shuō)明的是,如果要修改Session,需要額外引入命名空間,和實(shí)現(xiàn)一個(gè)接口(只需實(shí)現(xiàn),別的什么也不用做)
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;
}
}
}
}
有沒(méi)有發(fā)現(xiàn)上面實(shí)現(xiàn)的功能很簡(jiǎn)單呢?
下面,是客戶端代碼
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("當(dāng)前瀏覽器不支持創(chuàng)建XMLHTTPREQUEST對(duì)象,請(qǐng)更換瀏覽器");
return;
}
xmlhttp.onreadystatechange = callback;
xmlhttp.open("GET", "ModifySession.ashx?session=" + session, true);
xmlhttp.send(null);
}
function callback() {
//判斷和服務(wù)器的交互是否完成,還要判斷服務(wù)器端是否返回了數(shù)據(jù)
if (xmlhttp.readyState == 4) {
//表示和服務(wù)器端的交互完成
if (xmlhttp.status == 200) {
//alert("正確返回了數(shù)據(jù)");
return;
}
}
}
在回調(diào)函數(shù)中,我只寫了一個(gè)測(cè)試正常返回?cái)?shù)據(jù)的語(yǔ)句,后來(lái)注釋掉了。
在為a標(biāo)簽綁定事件時(shí),我最初用的是拼接字符串的方法,就是從數(shù)據(jù)庫(kù)中查到模塊ID和模塊名稱,然后通過(guò)下面的一條語(yǔ)句進(jìn)行語(yǔ)句拼接:
StringBuilder sbModel = new StringBuilder();
//將可以訪問(wèn)的模塊進(jìn)行菜單拼接
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>");
}
可是這樣寫的很容易出錯(cuò),雖然在復(fù)制進(jìn)來(lái)之前,我是寫過(guò)測(cè)試語(yǔ)句,然后再將變量寫到該寫位置的,但是這樣寫出來(lái)的語(yǔ)句是很難進(jìn)行調(diào)試的。
在和別人交流的過(guò)程中,說(shuō)道了Repeater控件,恍然大悟,我重復(fù)的這個(gè)過(guò)程,不就是Repeater控件干的事么?控件替我們干了,干嘛還要自己寫這么容易出錯(cuò)的代碼呢?
<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>
是不是這樣寫,感覺(jué)會(huì)清晰好多呢,因?yàn)槲抑坝玫钠唇幼址?,并且?shí)現(xiàn)了,用Repeater只是一個(gè)思路,在id拼接那不知道會(huì)不會(huì)又問(wèn)題,如果有問(wèn)題,歡迎斧正。
至此,我的第一篇有關(guān)AJAX的文章就寫完了,關(guān)于對(duì)AJAX的理解只是一個(gè)開(kāi)始,這個(gè)里面沒(méi)有涉及到數(shù)據(jù)交互,所以對(duì)于某些知識(shí)的解釋還是有些蒼白的,隨著學(xué)習(xí)的深入,關(guān)于AJAX的使用,不會(huì)僅僅停留在updatepanel和timer這些控件上的。對(duì)于某些不太難的實(shí)例,自己做一下還是比較好的。
關(guān)于這個(gè)例子,你可以問(wèn)用一個(gè)LinkButton其實(shí)就可以實(shí)現(xiàn),干嘛弄這么麻煩,但是我想說(shuō),我一開(kāi)始也沒(méi)有想到一個(gè)LinkButton就可以解決,是自己把問(wèn)題復(fù)雜化了,這個(gè)里面涉及到一個(gè)頁(yè)面跳轉(zhuǎn),其實(shí)完全可以用LinkButton解決,但是學(xué)習(xí)嘛就是一個(gè)過(guò)程,用自己犯的一個(gè)小迷糊促進(jìn)了對(duì)AJAX的理解,何嘗不是一件快事~~
對(duì)于AJAX的理解,還在一步步的進(jìn)行,如果有什么錯(cuò)誤,還望大家積極評(píng)論點(diǎn)評(píng)
先說(shuō)一下需求,我在做一個(gè)權(quán)限管理的時(shí)候,需要在點(diǎn)擊某個(gè)模塊時(shí),Session中相應(yīng)的改變模塊代號(hào),而實(shí)現(xiàn)這個(gè)操作的是一個(gè)a標(biāo)簽,當(dāng)然我不知道 一個(gè)linkbutton是否可以同時(shí)將跳轉(zhuǎn)頁(yè)面和修改Session做了,個(gè)人感覺(jué)應(yīng)該是可以的,具體能不能,如果有人做了Demo可以留言說(shuō)明。
a標(biāo)簽,實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn),他的onclick事件,執(zhí)行的也是本頁(yè)面中的js方法,現(xiàn)在就回到了題目所描述的問(wèn)題——寫一個(gè)JavaScript方法,使其修改Session。
其實(shí)這個(gè)例子不難,但是對(duì)我個(gè)人的意義卻非同尋常,這個(gè)例子解除了我一大部分對(duì)AJAX的恐懼。
首先,是寫一個(gè)一般處理程序(也就是服務(wù)端代碼)
需要說(shuō)明的是,如果要修改Session,需要額外引入命名空間,和實(shí)現(xiàn)一個(gè)接口(只需實(shí)現(xiàn),別的什么也不用做)
復(fù)制代碼 代碼如下:
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;
}
}
}
}
有沒(méi)有發(fā)現(xiàn)上面實(shí)現(xiàn)的功能很簡(jiǎn)單呢?
下面,是客戶端代碼
復(fù)制代碼 代碼如下:
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("當(dāng)前瀏覽器不支持創(chuàng)建XMLHTTPREQUEST對(duì)象,請(qǐng)更換瀏覽器");
return;
}
xmlhttp.onreadystatechange = callback;
xmlhttp.open("GET", "ModifySession.ashx?session=" + session, true);
xmlhttp.send(null);
}
function callback() {
//判斷和服務(wù)器的交互是否完成,還要判斷服務(wù)器端是否返回了數(shù)據(jù)
if (xmlhttp.readyState == 4) {
//表示和服務(wù)器端的交互完成
if (xmlhttp.status == 200) {
//alert("正確返回了數(shù)據(jù)");
return;
}
}
}
在回調(diào)函數(shù)中,我只寫了一個(gè)測(cè)試正常返回?cái)?shù)據(jù)的語(yǔ)句,后來(lái)注釋掉了。
在為a標(biāo)簽綁定事件時(shí),我最初用的是拼接字符串的方法,就是從數(shù)據(jù)庫(kù)中查到模塊ID和模塊名稱,然后通過(guò)下面的一條語(yǔ)句進(jìn)行語(yǔ)句拼接:
復(fù)制代碼 代碼如下:
StringBuilder sbModel = new StringBuilder();
//將可以訪問(wèn)的模塊進(jìn)行菜單拼接
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>");
}
可是這樣寫的很容易出錯(cuò),雖然在復(fù)制進(jìn)來(lái)之前,我是寫過(guò)測(cè)試語(yǔ)句,然后再將變量寫到該寫位置的,但是這樣寫出來(lái)的語(yǔ)句是很難進(jìn)行調(diào)試的。
在和別人交流的過(guò)程中,說(shuō)道了Repeater控件,恍然大悟,我重復(fù)的這個(gè)過(guò)程,不就是Repeater控件干的事么?控件替我們干了,干嘛還要自己寫這么容易出錯(cuò)的代碼呢?
復(fù)制代碼 代碼如下:
<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>
是不是這樣寫,感覺(jué)會(huì)清晰好多呢,因?yàn)槲抑坝玫钠唇幼址?,并且?shí)現(xiàn)了,用Repeater只是一個(gè)思路,在id拼接那不知道會(huì)不會(huì)又問(wèn)題,如果有問(wèn)題,歡迎斧正。
至此,我的第一篇有關(guān)AJAX的文章就寫完了,關(guān)于對(duì)AJAX的理解只是一個(gè)開(kāi)始,這個(gè)里面沒(méi)有涉及到數(shù)據(jù)交互,所以對(duì)于某些知識(shí)的解釋還是有些蒼白的,隨著學(xué)習(xí)的深入,關(guān)于AJAX的使用,不會(huì)僅僅停留在updatepanel和timer這些控件上的。對(duì)于某些不太難的實(shí)例,自己做一下還是比較好的。
關(guān)于這個(gè)例子,你可以問(wèn)用一個(gè)LinkButton其實(shí)就可以實(shí)現(xiàn),干嘛弄這么麻煩,但是我想說(shuō),我一開(kāi)始也沒(méi)有想到一個(gè)LinkButton就可以解決,是自己把問(wèn)題復(fù)雜化了,這個(gè)里面涉及到一個(gè)頁(yè)面跳轉(zhuǎn),其實(shí)完全可以用LinkButton解決,但是學(xué)習(xí)嘛就是一個(gè)過(guò)程,用自己犯的一個(gè)小迷糊促進(jìn)了對(duì)AJAX的理解,何嘗不是一件快事~~
對(duì)于AJAX的理解,還在一步步的進(jìn)行,如果有什么錯(cuò)誤,還望大家積極評(píng)論點(diǎn)評(píng)
您可能感興趣的文章:
- Javascript setInterval的兩種調(diào)用方法(實(shí)例講解)
- JavaScript SetInterval與setTimeout使用方法詳解
- JavaScript setTimeout和setInterval的使用方法 說(shuō)明
- javascript數(shù)組操作總結(jié)和屬性、方法介紹
- JavaScript字符串String和Array操作的有趣方法
- javascript操作cookie方法函數(shù)集合
- Javascript select下拉框操作常用方法
- javascript String split方法誤操作
- JavaScript使用setInterval()函數(shù)實(shí)現(xiàn)簡(jiǎn)單輪詢操作的方法
相關(guān)文章
JavaScript交換變量的常用方法小結(jié)【4種方法】
這篇文章主要介紹了JavaScript交換變量的常用方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript交換變量的4種實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05微信小程序?qū)崿F(xiàn)左側(cè)導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左側(cè)導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07頁(yè)面間固定參數(shù),通過(guò)cookie傳值的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇頁(yè)面間固定參數(shù),通過(guò)cookie傳值的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05JS實(shí)現(xiàn)帶動(dòng)畫的回到頂部效果
這篇文章主要為大家詳細(xì) 介紹了JS實(shí)現(xiàn)帶動(dòng)畫的回到頂部效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12JS & JQuery 動(dòng)態(tài)添加 select option
這篇文章主要介紹了JS & JQuery 動(dòng)態(tài)添加 select option 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-06-06JS遍歷頁(yè)面所有對(duì)象屬性及實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇JS遍歷頁(yè)面所有對(duì)象屬性及實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08JavaScript實(shí)現(xiàn)按照指定長(zhǎng)度為數(shù)字前面補(bǔ)零輸出的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)按照指定長(zhǎng)度為數(shù)字前面補(bǔ)零輸出的方法,實(shí)例分析了javascript操作數(shù)字補(bǔ)零的技巧,需要的朋友可以參考下2015-03-03