【问题标题】:How to store Data from static WebMethods into the ViewState如何将静态 WebMethods 中的数据存储到 ViewState 中
【发布时间】:2013-08-23 16:30:28
【问题描述】:

现在我做了一些研究。我需要将我从页面上的 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"];
     }

【问题讨论】:

    标签: c# asp.net web-services viewstate webmethod


    【解决方案1】:

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

    【讨论】:

    • 这不像我想象的那样工作。它仍然告诉我“非静态字段方法或属性'System.web.ui.Session.get'需要对象引用”我的非工作代码现在看起来像这样:[WebMethod(EnableSession = true)] [ScriptMethod]公共静态字符串 populateModels(string[] makeIds) { Session["SelectedMakes"] = makeIds; }
    • @AlexanderRyanBaggett - 啊,是的,抱歉忘记您已经从HttpContext.Current 中获取了Session,答案已更新以反映这一点。
    • 是的,我正在这里查看。 stackoverflow.com/questions/2577183/… 我可以为其分配一个字符串[],但我似乎无法从中提取一个字符串[]。当我尝试检索它时,它正在谈论投射它。
    • 基本上我需要一种将其转换为字符串数组的方法或一种将单个元素作为字符串访问的方法。
    • @AlexanderRyanBaggett - 抱歉我离开了一会儿,很高兴你解决了你的问题。祝你好运。 :-)
    【解决方案2】:

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

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

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

    【讨论】:

    • 那里有有趣的想法。隐藏字段,我以前听说过,但没有在实践中使用过。
    • @AlexanderRyanBaggett 如果您走出 WebForms 世界,您会发现隐藏字段的使用频率更高。它们非常适合 MVC,例如,您需要发布包含其 ID 的完整模型,但不希望 ID 像输入字段中的其他属性一样可见。请记住,它们根本不是秘密的 - 没有加密,甚至没有编码,并且可以很容易地被用户操纵 - 不像 ViewState,它总是经过验证以帮助防止简单的篡改,并且通常是服务器加密的。跨度>
    • 感谢您的建议。我在电子商务部门工作的兄弟说他们在他工作的地方使用了隐藏字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多