ASP.NET:将ViewState移动到页面底部

时间:2010-03-04 14:46:21

标签: asp.net viewstate webforms

将ViewState移至页面底部的最新最佳方式

是否可以在 web.config 中指定的 IHttpHandler 中截取,以拦截对“* .aspx”的请求?

<httpHandlers>
    <add verb="*" path="*.aspx" type="MyApp.OptimizedPageHandler" />
<httpHandlers>

其他选项是,这可以在 IHttpModule 中完成,但不是高效的,因为它会拦截所有请求。

此外,它可以在一个派生自 Page MasterPage 类的类中完成,但不是模块化的。< / p>

对此有性能处罚吗?

3 个答案:

答案 0 :(得分:2)

您可以通过创建PageStatePersister类的自定义实现来控制加载和保存ViewState数据的方式和位置。然后为所有ASPX页面创建一个基类,并覆盖PageStatePersister方法以返回自定义实现。然后,可以根据您的要求使用您想要存储视图状态的任何页面事件。

我怀疑它是否值得。你是否在ViewState不必要地存储了大量数据?也许只需使用ViewState更少或关闭某些控件就可以获得更多的好处,而不是仅仅将其移动到HTML页面中的其他位置。

答案 1 :(得分:1)

在进行一些研究之后,我将this blog-post放在一起。

我通过创建 HttpModule 并应用响应过滤器解决了这个问题,修改了页面的输出并将ViewState移动到表格的底部。

public class ViewStateSeoHttpModule : IHttpModule {
    public void Init(HttpApplication context) {
        context.BeginRequest += new EventHandler(BeginRequest);
    }

    private void BeginRequest(object sender, EventArgs e) {
        HttpApplication application = sender as HttpApplication;

        bool isAspNetPageRequest = GetIsAspNetPageRequest(application);
        if(isAspNetPageRequest) {
            application.Context.Response.Filter =
                new ViewStateSeoFilter(application.Context.Response.Filter);
        }
    }

    private bool GetIsAspNetPageRequest(HttpApplication application) {
        bool isAspNetPageRequest = application.Context.Handler is System.Web.UI.Page;
        return isAspNetPageRequest;
    }
    // [...]

答案 2 :(得分:0)

扩展Page类使您可以最大程度地控制页面呈现。如果要将ViewState移动到给定页面的底部,请使用该页面的自定义基类。如果您不需要,请使用Page类。

从Page类派生时唯一的性能风险是在重写方法的实现中。除非你做的事情特别低效,否则不应该有任何可察觉的性能损失。