根据 AJAX 调用结果设置会话变量

set a session variable base on ajax call result

提问人:user464291 提问时间:9/9/2023 最后编辑:Manoj Agrawaluser464291 更新时间:9/11/2023 访问量:39

问:

我想在代码隐藏中设置一个会话变量,因此在收到基于该结果的ajax调用结果后,设置一个会话变量。

此应用程序是旧的 Web 表单,不是 MVC 这是我所做的

在我的独立 JS 中(试图将我的值发布到同一个 aspx 页面,这是真的

$(document).ready(function () {
     console.log("Document is ready.");
     $.ajax({
         type: "POST",
         url: "CheckBrowser.aspx/SetSessionVariable",
         data: JSON.stringify({ value: 'true' }),
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         success: function (response) 
         {
             // Handle the server's response (if needed)
             console.log("success");
         },
         error: function (error) {
             console.log("AJAX Error: " + error);
         }
     }); 
}

test.aspx 具有此 JS 在测试中.aspx.cs我定义了函数,这样我就可以使用以下方法将我在 Ajax 发布期间发送的 true 分配给我的会话变量

[WebMethod]
protected void SetSessionVariable(string data)
{
   Session["myTest"] = data;
}

但是,我收到以下错误:未知的 Web 方法 SetSessionVariable [ArgumentException:未知的 Web 方法 SetSessionVariable。 参数名称:methodName] System.Web.Script.Services.WebServiceData.GetMethodData(字符串方法名称) +626166 System.Web.Handlers.ScriptModule.OnPostAcquireRequestState(对象发送方,EventArgs eventArgs)+218 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +144 System.Web.HttpApplication.ExecuteStepImpl (IExecutionStep 步骤) +50 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值& completedSynchronously) +73'

任何建议将不胜感激

C# asp.net AJAX

评论

1赞 quaabaam 9/9/2023
这回答了你的问题吗?asp.net Web 窗体 [WebMethod]
1赞 quaabaam 9/9/2023
在上面的链接和接受的答案中指定的链接中,请注意它如何将方法指定为 ,并且它传递参数的名称,而不仅仅是值。static
0赞 user464291 9/9/2023
[WebMethod] protected static void SetSessionVariable(string value) { // 使用隐藏字段或 JavaScript 变量从客户端获取数据,并设置会话变量 HttpContext.Current.Session[“myTest”] = value; } 按照您的建议更改为 static,参数名称为 value ,与 data 同名:JSON.stringify({ value: 'true' }),在我的 Ajax 调用中。我得到下面的错误,请参阅下一条评论
0赞 user464291 9/9/2023
请求 URL:本地主机:xxxx/支持/测试.aspx/设置会话变量 请求方法:POST 状态代码:500 远程地址:[::1]:44310 引用策略:严格源-跨源时
0赞 quaabaam 9/9/2023
因此,看起来与这篇文章相关的问题已解决,您现在又遇到了另一个问题。我认为这篇文章,如何允许 cors-for-asp-net-webforms-endpoint,可能有你的新问题的答案。如果没有,您应该在新问题上发表新帖子。

答:

1赞 Albert D. Kallal 9/9/2023 #1

好的,这里有几个问题,其中一些在评论中指出。

首先:

调用的 Web 方法必须是“静态”的。换句话说,这一段代码必须作为“独立”代码运行。此处没有创建页面类的实例(因此该 Web 方法无法引用给定页面上的控件)。

此外,由于 Web 方法是静态的,并且“独立于”当前网页类实例,因此您必须引用 session[] different 。

最后但同样重要的:

如果您打开了友好 URL,则必须更改路由页面,否则您的 Web 方法将不起作用。

所以,让我们在这里纠正一些零碎的东西。

因此,在 aspx 页面中,方法将按如下方式定义:

 using System.Web.Services;   <--- don't forget this at top


    [WebMethod(enableSession: true)]
    public static void SetSessionVariable(string Value)
    {
        HttpContext.Current.Session["myTest"] = Value;
        Debug.Print("session value set");

    }

因此,您必须在上面的编译器指令中启用会话。

请注意,现在您必须使用当前的 Http 上下文来使用会话。

客户端代码将与您拥有的代码非常相似。

        <asp:Button ID="cmdTest" runat="server" Text="Set session value"
            CssClass="btn"
            OnClientClick="mytest();return false"
            />

        <script>

            function mytest() {

                $.ajax({
                    type: "POST",
                    url: "ActiveImage.aspx/SetSessionVariable",
                    data: JSON.stringify({ Value: 'true' }),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response) {
                        // Handle the server's response (if needed)
                        console.log("success");
                    },
                    error: function (error) {
                        console.log("AJAX Error: " + error);
                    }
                }); 

            }

        </script>

因此,对于测试,我们不会使用准备好的页面。让我们让代码正常工作,然后“进展”让此类代码在浏览器页面加载事件上运行。

好的,最后但并非最不重要的一点是,如果您使用的是友好的 URL,那么您需要打开 RouteConfig.cs,并设置 AutoRedirectMode = off。

 settings.AutoRedirectMode = RedirectMode.Off;

还要注意我如何使用“V”代替“v”来表示要传递的参数(“value”与“Value”)。传递给 Web 方法的参数区分大小写,因此必须匹配。

评论

0赞 user464291 9/9/2023
谢谢你的详细解释。这解决了我的一个原始错误,但我收到 CORS 错误,不知道为什么,因为它是同一个起源。我创建了另一个帖子,因为另一个用户建议我正在关闭这个帖子并继续。这是链接 stackoverflow.com/questions/77071255/...。我希望你能给我一些建议