5

现在我做了一些研究。我需要将我从页面上的 WebMethod 的 ajax 调用中检索到的一些数据存储到某个地方,以便我可以随时再次将其拉回。

起初我认为 ViewState 将是最好的选择。不幸的是,您不能像在非静态方法中那样引用它。即使我创建页面实例以将其存储在 ViewState 中,我相信它会在方法结束时取消实例化,从而破坏我保存的任何数据。

我需要这些数据用于在其他 WebMethod 中进行的数据库调用。

我的 aspx 页面的 C# 代码隐藏中的基本方法如下所示:

    [WebMethod]
    [ScriptMethod]
    public static string populateModels(string[] makeIds)
    {

    }

因此,例如,我需要保存选定的品牌以供将来的数据库调用使用。因为我的大部分盒子在过滤和从数据库中提取方面都是级联的。

更新:

此代码用于在静态 WebMethods 中的 SessionState 中检索和存储数据。

    [WebMethod(EnableSession = true)]
    [ScriptMethod]
    public static string populateYears(string[] modelIds)
    {

        HttpContext.Current.Session["SelectedModels"] = modelIds;

        string[] makeids = (string[])HttpContext.Current.Session["SelectedMakes"];
     }
4

2 回答 2

7

正如 Joe Enos 所指出的,ViewState它是页面实例的一部分,但您可以使用Session缓存,如下所示:

[WebMethod(EnableSession = true)]
[ScriptMethod]
public static string populateModels(string[] makeIds)
{
    // Check if value is in Session
    if(HttpContext.Current.Session["SuperSecret"] != null)
    {
        // Getting the value out of Session
        var superSecretValue = HttpContext.Current.Session["SuperSecret"].ToString();
    }

    // Storing the value in Session
    HttpContext.Current.Session["SuperSecret"] = mySuperSecretValue;
}

注意:这也将允许您使用 ASP.NET AJAX 页面方法的部分页面来获取或存储一些值到服务器,同时还允许您的页面回发也可以访问数据Session

于 2013-08-23T16:52:46.410 回答
6

ViewState 是页面的一个属性,它贯穿 ASP.NET WebForms 页面生命周期。将 WebMethods 与 AJAX 一起使用会跳过整个页面生命周期,并完全跳过 ViewState。

因此,您将无法以您正在查看的方式使用 ViewState。为了使用 AJAX 并且仍然可以访问 ViewState 和控件属性等所有 WebForms 内容,您需要使用 UpdatePanels。

您需要找到替代方案 - 例如,您可以将内容放入隐藏字段中,而不是 ViewState,然后使用 javascript 读取和填充这些隐藏字段。如果您这样做,您可以从 javascript 和 ASP.NET 世界中读取和写入这些字段。

于 2013-08-23T16:34:45.777 回答