この記事では、JavaScript を使用してセッションの操作を制御する方法を紹介します。困っている友人が参考になれば幸いです。
この質問を見て、JavaScript はクライアントを表し、Session はサーバーを表すと疑問を持つ人もいるかもしれません (これをすべての人が理解できるかどうかはわかりません)。
まず要件について説明します。アクセス許可管理を行う場合、この操作を実装するのは、Of タグです。もちろんわかりませんが、リンク ボタンでページにジャンプすると同時にセッションを変更することは可能でしょうか。誰かがデモを作成している場合は、メッセージを残して説明することは可能だと思います。 。
タグはページ ジャンプを実装します。その onclick イベントもこのページの js メソッドを実行します。ここで、タイトルで説明した問題に戻ります。Session を変更するための JavaScript メソッドを記述します。
実際、この例は難しいものではありませんが、私にとってこの例は AJAX に対する私の恐怖の大部分を和らげてくれました。
まず、一般的なハンドラー (つまり、サーバー側のコード) を作成します。
セッションを変更したい場合は、追加の名前空間を導入し、インターフェイスを実装する必要があることに注意してください (実装するだけで済みます。それ以外の場合は何もする必要はありません)
コードは次のとおりです:
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; } } } }
上で実装した関数は非常に単純であることがわかりましたか?
次はクライアント コードです
コードは次のとおりです:
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; } } }
コールバック関数では、通常の関数をテストするためのステートメントのみを作成しました。データの返却、後でコメントアウトされました。
イベントを a タグにバインドするとき、最初は文字列を結合する方法を使用しました。これは、データベースからモジュール ID とモジュール名を見つけて、次のステートメントを介してステートメントを結合するというものです:
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 コントロールが行っていたことであることに気づきました。コントロールがそれを行ってくれますが、なぜこのようなエラーが発生しやすいコードを自分で記述する必要があるのでしょうか?
<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>
このように書くと、以前は文字列を継ぎ合わせて実装したことがあったので、よりわかりやすくなります。 ID のスプライシング時に問題が発生しました。問題がある場合は修正してください。
これまでのところ、AJAX についての最初の記事を書き終えました。AJAX の理解はまだ始まったばかりなので、知識の説明はまだ少し深まっています。学習において、AJAX の使用は updatepanel やタイマーなどのコントロールだけにとどまりません。それほど難しくない例もありますので、自分で実行する方がよいでしょう。
この例に関しては、実際に LinkButton を使用して実現できるのに、なぜそんなに面倒なのかと疑問に思うかもしれませんが、最初は LinkButton で問題が解決するとは思っていなかったと言いたいのです。はい、これにはページ ジャンプが含まれていますが、実際には LinkButton を使用して解決できますが、AJAX の理解を促進するために私が作成した少しの混乱を利用するのは楽しいことです。 🎜>
AJAX の理解はまだ段階的に進んでいます。間違いがあれば、コメントを残してください。プログラミング入門! !