假设我有一个静态方法,我需要从该方法访问viewstate ...我怎么能这样做...我知道这是不可能的,但必须有一些出路。
[WebMethod]
public static string GetData(int CustomerID)
{
string outputToReturn = "";
ViewState["MyVal"]="Hello";
return outputToReturn;
}
答案 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)
我试过这个并为我工作:
-
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;
}