将ViewState移至页面底部的最新最佳方式
是否可以在 web.config 中指定的 IHttpHandler 中截取,以拦截对“* .aspx”的请求?
<httpHandlers>
<add verb="*" path="*.aspx" type="MyApp.OptimizedPageHandler" />
<httpHandlers>
其他选项是,这可以在 IHttpModule 中完成,但不是高效的,因为它会拦截所有请求。
此外,它可以在一个派生自 Page 或 MasterPage 类的类中完成,但不是模块化的。< / p>
对此有性能处罚吗?
答案 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类派生时唯一的性能风险是在重写方法的实现中。除非你做的事情特别低效,否则不应该有任何可察觉的性能损失。