重写页面基类后导致VIEWSATE丢失对象

厦门德仔
博客专家认证
2010-06-27 03:33:49
我重新了页面基类page,BasePage页面的时候继承这个类。发现VIEWSATE莫名丢失了?
重写页面基类是判断SESSION丢失。但却影响要VIEWSATE。请问各位有好的解决方案么?
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
厦门德仔 2010-06-28
  • 打赏
  • 举报
回复
阁下 能否留下QQ详谈
  • 打赏
  • 举报
回复
除非万不得已,不要override人家的组件。你应该好好搞明白胡乱将OnInit改为调用 base.OnLoad,以及丢弃调用base方法,的后果是什么!
  • 打赏
  • 举报
回复
“判断Session对象”只要使用事件就好了:
using System.Web.UI;

public class MyClass:Page
{
public MyClass()
{
this.Load += new System.EventHandler(MyClass_Load);
}

void MyClass_Load(object sender, System.EventArgs e)
{
if (Session["userid"] == null)
Response.Redirect("~/navigate.aspx?state=userid_is_null");
}
}

事件才是安全的,不至于(就像你懂不懂override那样)因为随便乱写而破坏人家原来的程序。

另外,更加方便地,你可以写一个ascx,在它的Page_Load中去判断这个Session["userid"],并且在为空时重定向。这样,如果哪一个aspx、ascx、master page需要这个判断,直接把ascx用鼠标拖进去就OK了,不用去重新写原来的代码。
  • 打赏
  • 举报
回复
什么意思呢?在 OnInit 中调用 base.OnLoad(e)? 还把人家原来的 OnLoad 给丢失了,故意弄一个空的 OnLoad 来顶替?

不知道写这个东西想干什么啊?
showlin 2010-06-27
  • 打赏
  • 举报
回复
你哪里用到ViewState了。。。。。
只有Session。。。。

ProcessRequest方法是请求刚发起时的,那个时候SessionState实例还没有呢
改到OnLoad中去吧
wuyq11 2010-06-27
  • 打赏
  • 举报
回复
在继承页面使用viewstate记录是没有影响的
还可使用IhttpHanlder判断session
厦门德仔 2010-06-27
  • 打赏
  • 举报
回复
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using TX.Components;
namespace TX.Components
{
/// <summary>
/// PageBase 的摘要说明
/// </summary>
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public override void ProcessRequest(HttpContext context)
{
/*
if (Session["userid"] == null)
{
JScript.ShowMsg(this.Page, "会话已丢失", BaseUrl + "Login.aspx");
}
*/
base.ProcessRequest(context);
}
protected override void OnInit(EventArgs e)
{

if (Session["userid"] == null)
{
JScript.ShowMsg(this.Page, "会话已丢失", BaseUrl + "Login.aspx");
}
base.OnLoad(e);
}
protected override void OnLoad(EventArgs e)
{


}
public string BaseUrl
{
get
{
string strBaseUrl = "";
strBaseUrl += "httP://" + HttpContext.Current.Request.Url.Host;
if (HttpContext.Current.Request.Url.Port.ToString() != "80")
{
strBaseUrl += ":" + HttpContext.Current.Request.Url.Port.ToString();
}
strBaseUrl += HttpContext.Current.Request.ApplicationPath;
return strBaseUrl + "/";
}
}
}
}
showlin 2010-06-27
  • 打赏
  • 举报
回复
页面生存周期是
PreInit
Init
Load
PreRender
Renader
Unload
一般在Load时,如果是回发的页面,会在这个时候加载ViewState
你是不是在重写PreInit了,在这个时候设置ViewState,后面会被覆盖的
fuda_1985 2010-06-27
  • 打赏
  • 举报
回复
。。。你怎么重写的呢。一般重写不会出现这种情况!
你重载基类方法的最后有没有写base.基类的方法啊?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧