从aspx页面中的Static方法访问ViewState

时间:2011-09-05 14:00:08

标签: asp.net

假设我有一个静态方法,我需要从该方法访问viewstate ...我怎么能这样做...我知道这是不可能的,但必须有一些出路。

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

3 个答案:

答案 0 :(得分:14)

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

因此要么不使用静态方法,请使用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调用,这将无效,因为它在Page-Lifecycle之外。

答案 1 :(得分:10)

您可以对[WebMethod(EnableSession=true)]使用PageMethod,并使用Session代替ViewState。请记住,使用静态PageMethod时,不会创建Page类的任何实例,因此ViewState这样的好东西根本不存在,并且没有办法让它们在那里。

答案 2 :(得分:2)

我试过这个并为我工作:

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

-

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;
}