最近才看到网上有一种对asp.net web form的误解。也有很多讨论,弄得微软ScottGu也来澄清。asp.net mvc和web form是并行存在的两种开发模式。许多人对web form的诟病很多,其中最主要的就是说viewstate,随便一个web form页面,其html源码就体积很大,主要是隐藏字段viewstate体积比较大,至少几十K,页面复杂一点,viewstate的大小能上几兆,这样大体积的页面,在浏览器和服务器之间传输,对网络带宽也是一个很大的压力,所以asp.net webform的性能肯定受很大影响。这其实是一个对asp.net web form的特大误解。这里提供一个小技巧。可以让asp.net web form的页面和asp.net mvc的页面一样体积小巧。同时还能享受viewstate带来的好处。
举例来说:一个显示记录列表的form。如下图:
这是一个很简单的页面了。其html源代码是:
可见其隐藏字段viewstate体积较大。对应用程序的性能会有较大影响。
通过如下方法,可以让页面html源代码体积变小巧。
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace EntLibSample{ public class BasePage : System.Web.UI.Page { protected override void SavePageStateToPersistenceMedium(object viewState) { Session["viewState" + this.Context.Request.FilePath] = viewState; } protected override object LoadPageStateFromPersistenceMedium() { if (Session["viewState" + this.Context.Request.FilePath] != null) { return Session["viewState" + this.Context.Request.FilePath]; } return string.Empty; } }}
这个BasePage类继承了System.Web.UI.Page类。System.Web.UI.Page中的SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium方法是将viewstate的内容发到客户端浏览器中,那么每次向服务器发请求,都需将体积庞大的viewstate字段发回服务器,服务器返回结果时,又将体积庞大的viewstate字段发回来。这给应用程序整体性能带来了很大冲击。BasePage类改写了此两个方法。将viewstate内容放到session中,用的时候又从session取回来。这样避免了在网络上来回传输体积庞大的viewstate内容。
应用程序的所有页面都继承此BasePage类。这样就可以将此方法应用于所有的asp.net web form页面。
其效果如下:
可见viewstate字段的内容完全没有了。这样html源代码的整体体积就小了很多。这对应用程序的性能提高是很大好处的。曾经只有asp.net mvc才有的体积小页面,现在asp.net web form也可以做到了。同时asp.net web form还有开发效率相对较高,还可以利用viewstate带来的好处,有了这些综合考虑,大家应该会重拾对asp.net web form的信心,继续在asp.net web form的旅程。