我可以从httpModule访问curent页面视图状态

时间:2016-01-06 06:45:48

标签: c# webforms viewstate httpmodule httpcontext

要避免在用户点击浏览器的刷新按钮时出现重新发送请求的已知问题,

我决定添加一个HttpModule,我覆盖load_Complete方法将页面重定向到自己。我基本上,跟踪HiddenField值,并在重定向后恢复它们。

这很好用,现在的问题是页面的视图状态数据在重定向后丢失(这是预期的行为)。

所以,问题是,有没有一种方法可以在重定向之前访问页面的视图状态数据(就像我对HiddenField控件那样 - 存在于_page.Controls中)?也许来自httpContext?

这是我的HttpModule片段:

public void Init(HttpApplication context)
{
    context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}

void context_PreRequestHandlerExecute(object sender, EventArgs e)
{               
    _httpContext = System.Web.HttpContext.Current;

    if (_httpContext != null) {
        _page = _httpContext.Handler as System.Web.UI.Page;

        if (_page != null) {
            _page.Load += new EventHandler(_page_Load);
            _page.LoadComplete += new EventHandler(_page_LoadComplete);
        }
        else { return; }

    }
    else { return; }
}

void _page_LoadComplete(object sender, EventArgs e)
{       
    if (_page.IsPostBack) {                       
        /*
        I Dump all hiddenfield values in 1 session variable
        */          
        //hoping to do the same for page's ViewState

        _httpContext.Response.Redirect(_httpContext.Request.RawUrl, false);
    }
}

void _page_Load(object sender, EventArgs e)
{   
    if (!_page.IsPostBack) {
        /*
        restore page hiddenfield controls
        */          
        //hoping to do the same for page's ViewState
    }
}

1 个答案:

答案 0 :(得分:1)

我最后添加了一个Base Page类,并将我的所有页面都更改为从这个BasePage继承。

在基本页面内我有2个公共方法,logViewState()restoreViewState()。基本上这些方法将ViewState保存到Session并分别从会话恢复ViewState。

来自_page_Load我致电logViewState(),然后致电_page_LoadComplete我致电logViewState()

希望这有助于某人。