如何将静态WebMethods中的数据存储到ViewState中

本文关键字:数据 存储 ViewState 静态 WebMethods | 更新日期: 2023-09-27 18:28:52

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

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

我需要这些数据,以便在其他WebMethods中进行数据库调用。

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

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

例如,我需要保存所选的make,以便将来调用数据库。因为我的大多数盒子都是从数据库中筛选和提取的。

更新:

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

    [WebMethod(EnableSession = true)]
    [ScriptMethod]
    public static string populateYears(string[] modelIds)
    {
        HttpContext.Current.Session["SelectedModels"] = modelIds;
        string[] makeids = (string[])HttpContext.Current.Session["SelectedMakes"];
     }

如何将静态WebMethods中的数据存储到ViewState中

正如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访问数据。

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

因此,您将无法使用ViewState的外观。为了使用AJAX并且仍然可以访问所有的WebForms内容,如ViewState和控件属性,您需要使用UpdatePanels。

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