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