Asp.net 从aspx页面中的静态方法访问ViewState

Asp.net 从aspx页面中的静态方法访问ViewState,asp.net,Asp.net,假设我有一个静态方法,我需要从该方法访问viewstate…我怎么能这样做…我知道这是不可能的,但一定有办法 [WebMethod] public static string GetData(int CustomerID) { string outputToReturn = ""; ViewState["MyVal"]="Hello"; return outputToReturn; } 您可以通过获取对该页面的引用。但是由于受保护,因此您无法访问它(不使用

假设我有一个静态方法,我需要从该方法访问viewstate…我怎么能这样做…我知道这是不可能的,但一定有办法

 [WebMethod]
 public static string GetData(int CustomerID)
 {
     string outputToReturn = "";
     ViewState["MyVal"]="Hello";
     return outputToReturn;
 }

您可以通过获取对该页面的引用。但是由于受保护,因此您无法访问它(不使用反射),而
会话可以通过
HttpContext.Current.Session
访问

因此,要么不要使用静态方法,要么使用
会话
,要么使用这种反射方法:

public static string CustomerId
{
    get { return (string)GetCurrentPageViewState()["CustomerId"]; }
    set { GetCurrentPageViewState()["CustomerId"] = value; }
}

public static System.Web.UI.StateBag GetCurrentPageViewState()
{
    Page page = HttpContext.Current.Handler as Page;
    var viewStateProp = page?.GetType().GetProperty("ViewState",
        BindingFlags.FlattenHierarchy |
        BindingFlags.Instance |
        BindingFlags.NonPublic);
    return (System.Web.UI.StateBag) viewStateProp?.GetValue(page);
}

但是,如果通过WebService调用,这将不起作用,因为它位于外部。

您可能可以对您的
PageMethod
使用
[WebMethod(EnableSession=true)]
,并使用
Session
而不是
ViewState
。记住,使用静态的
PageMethod
时,不会创建Page类的实例,所以像
ViewState
这样的好东西根本不存在,也没有办法让它们存在。

我尝试了这个方法,为我工作:

  • 创建一个包含要访问的viewState属性的类
  • 在构造函数中,传递真实的ViewState
  • 创建类的静态实例,但不初始化它
  • 在PageLoad中,初始化非静态类和静态类
  • 使用静态类属性访问ViewState
-


如果你知道这是不可能的,为什么你认为一定有办法做到?什么的
ViewState
<代码>视图状态
控件/页面
的一部分,但您似乎在调用(静态?
Web服务
),因此没有
视图状态
public class Repository
{
    public int a
    {
        get
        {
            if (_viewState["a"] == null)
            {
                return null;
            }

            return (int)_viewState["a"];
        }
        set
        {
            _viewState["ActiveGv"] = value;
        }
    }

    public StateBag _viewState;

    public Repository(StateBag viewState)
    {
        _viewState = viewState;
    }
}

static Repository staticRepo;

protected void Page_Load(object sender, EventArgs e)
{
    Repository repo = new Repository(ViewState);

    staticRepo = repo;
}

public static void testMethod()
{
    int b = staticRepo.a;
}