所以我有一个方法,我从互联网“借用”我在许多页面上使用来处理网格列的排序。
private string GetSortDirection(string column)
{
// By default, set the sort direction to ascending.
string sortDirection = "ASC";
// Retrieve the last column that was sorted.
string sortExpression = ViewState["SortExpression"] as string;
if (sortExpression != null)
{
// Check if the same column is being sorted.
// Otherwise, the default value can be returned.
if (sortExpression == column)
{
string lastDirection = ViewState["SortDirection"] as string;
if ((lastDirection != null) && (lastDirection == "ASC"))
{
sortDirection = "DESC";
}
}
}
// Save new values in ViewState.
ViewState["SortDirection"] = sortDirection;
ViewState["SortExpression"] = column;
return sortDirection;
}
现在它工作得很好,但是,我必须将它复制到我想要调用它的每个页面,因为它引用了viewstate。所以我想将它移动到我的助手类,并将其存储在会话状态中,但是,我可以在辅助类中引用它。
他们以任何方式从帮助类访问会话吗?我可以通过引用传递会话状态吗?
答案 0 :(得分:3)
如果我正确理解了这个问题,那么您希望从非页面的类中访问ViewState
或Session
。
如果是,您可以使用HttpContext.Current.Session
,或者您应该能够HttpContext.Current.CurrentHandler
输入Page
,然后访问ViewState
。
或者,您可以随时将代码放在基类中,您的所有页面都将继承该基类,而不是继承自System.Web.UI.Page
。
答案 1 :(得分:1)
不,你不使用Session,因为如果你测试Session,你有用户1选择One Columns 1,并且他更改了页面,他将拥有相同的选定列,这是问题,因为当使用initilize页面时,他必须有初始状态,没有选定状态。
从技术上讲,你可以使用Session,但对于我来说,这不是推荐的
答案 2 :(得分:1)
您可以在任何引用System.Web并在Web进程中执行的程序集中使用HttpContext.Current.Session
。
但是,在Session中放置泛型(即在多个位置重用,非特定键)值将导致各种麻烦。例如,如果用户在同一会话中打开两个浏览器窗口该怎么办?
我建议使用基本Page
/ Control
/ UserControl
类,或使用页面数据初始化的帮助程序类。您的代码示例看起来更像是属于与控件相关的基类。
答案 3 :(得分:1)
您可以使用System.Web.HttpContext.Current但是您可能会遇到使用此类会话状态的一些同步问题。您可以将GetSortDirection方法添加为页面的扩展方法,这可能更容易实现。