教你50招提升ASP.NET性能(二十):7条便利的ViewState技巧
(32)Seven handy ViewState tips
招数32:
7条便利的ViewState技巧
Every time I have to deal with a classic ASP.NET Web Forms application, one of the first things I look at is the resulting source, to check whether the DOM is a complete mess and whether the ViewState is an enormous, unnecessary blob of ugliness. Usually, they indicate what kind of mess will be found further down the stack.
每次我不得不处理一个传统的ASP.NET Web Forms应用时,首先查看生成的源码,检查DOM是否一团糟、ViewState是否是很大,多余的丑陋代码块。通常,它们预示着发现的烂摊子会更烂。
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wFzY3JpcHQ6IE9uY2xpY2s9J3dpbmRvdy5vcGVuKCJFcXVpcG1lbnQtRGV0YWlscy5hc3B4P1VzZWQtMjAxMC1UZXJl…(continues for 18,000 characters)…UlVTIiB3aWR0aD=” />
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wFzY3JpcHQ6IE9uY2xpY2s9J3dpbmRvdy5vcGVuKCJFcXVpcG1lbnQtRGV0YWlscy5hc3B4P1VzZWQtMjAxMC1UZXJl…(此处省略18,000个字)…UlVTIiB3aWR0aD=” />
Inadvertently using ViewState when it’s not necessary substantially increases the amount of data going back and forth, and can lead to a greater prevalence of invalid ViewState exceptions; the bigger the blob, the more likely it could be interrupted in transmission and not be posted back in entirety in a post.
当没有必要大幅度地增加往来数据量时无意中使用ViewState,可能导致更大的普遍无效的ViewState异常;代码块越大,越有可能在传输中中断并且可能在一次提交中不完全回发。
(33)Unless you’re tracking a Text_Changed event, you don’t need ViewState enabled on TextBoxes and similar controls. Classic ASP.NET automatically repopulates TextBox.Text values upon postback, even without ViewState enabled. Turn it off on each TextBox with EnableViewState= “false” on each one.
招数33:
除非跟踪一个Text_Changed事件之外,你不需在TextBoxes和类似的控件上要启用ViewState。传统的ASP.NET回发时会自动地填充TextBox.Text的值,甚至没有启用ViewState的情况下。在每个TextBox使用EnableViewState=“false”关掉ViewState。
You can do this for other controls like labels, but unless you’re setting their values after the page’s load event, you won’t reduce the size of the ViewState.
你可以在其它控件像labels禁用ViewState,但是除非在页面加载事件后设置它们的值,你将不能减少ViewState的大小。
(34)The same goes for most implementations of Repeaters, ListViews, and so on. These are usually the biggest culprits and they can be ugly. The advantage of ViewState with these is avoiding having to populate values again in a postback.
招数34:
这同样适用于Repeaters, ListViews, 等等大多数的控件实现。这些通常可能成为丑陋的罪魁祸首。ViewState对于这些的优势是避免不得不在回发时重新填充值。
If you’re convinced that it’s worth passing ViewState back and forth again and again to save your app the extra database hit…well…you’re probably wrong. Save the database hit (if you need to) with some caching and disable that dang ViewState on that Repeater!
如果你相信这是值得一次又一次地回传ViewState以便节省你的应用程序额外的数据库访问...好...你可能错了。使用一些缓存减少数据库访问(如果你需要)并且在Repeater上禁用那见鬼的ViewState才是正道!
(35)If you’re re-binding data anyway, or just toggling one property on postback (asp:Panel anyone?), turn off that ViewState! Please!
招数35:
如果你无论如何也要重新绑定数据,或者只是在回发时切换一个属性(asp:Panel 任何一个),请关掉ViewState!
(36)If you do need ViewState, understand the page lifecycle and bind your data appropriately. A control loads its ViewState after Page_Init and before Page_Load, i.e. server controls don’t start tracking changes to their ViewState until the end of the initialization stage.
招数36:
如果你确实需要使用ViewState,理解页面的生命周期并适当地绑定数据。控件在Page_Init之后Page_Load之前加载它的的ViewState,也就是说,服务端控件在结束初始化阶段之前都没有开始跟踪ViewState的改变。
Any changes to ViewState mean a bigger ViewState, because you have the before value and the after value. So, if you’re changing or setting a control’s value, set it before ViewState is being tracked, if possible.
任何ViewState的更改意味着更大的ViewState,因为你获得更改前后的值。所以,如果你正在改变或设置控件的值,如果可能的话,设置它之前的ViewState是正在跟踪的。
(37)You may think it’s impossible to turn off ViewState on a DropDownList, even if you re-bind it on every postback. But with a tiny bit of elbow grease you can keep ViewState enabled and avoid passing all your option values back and forth. This is particularly worthwhile for DropDownLists with a big ListItem collection.
招数37:
你也许认为在DropDownList上关掉ViewState是不可能的,即时你在每次回发时重新绑定它。但是随着一点点的费力工作你能够保持ViewState的启用并且避免反复地传输所有的选项值。
One way is to turn off ViewState and bind the select value manually to the actual posted value, like so:
一种方法是关闭ViewState并手动绑定实际传输的选项值,像这样:
string selectedId = Request[Countries.UniqueID];
if (selectedId != null)
Countries.SelectedValue = selectedId;
However, you may prefer something I came across more recently. Instead of binding your DropDown-List in the typical Page_Load or Page_Init, bind it in the control’s Init event:
然而,你可能更喜欢我最近的一些尝试。在控件的Init事件上绑定事件,而不是在传统的Page_Load或Page_Init事件绑定你的DropDown-List。
<asp:DropDownList ID=”Countries” ...
OnInit=”CountryListInit” />
protected void CountryListInit(object sender, EventArgs e)
{
Countries.DataSource = // get data from database
Countries.DataBind();
}
(38)Make it your habit to turn off ViewState on every control by default, and only turn it on when you need it. If a page doesn’t need ViewState anywhere, turn it off at the page level.
招数38:
你应该养成一个习惯:在默认情况下关闭所有控件的ViewState,只有当你需要的时候打开ViewState。如果一个页面不需要任何ViewState,在页面级关闭它。
You do all that work to reduce requests, combine and compress static references, and make sure your code is as clean as possible - don’t ruin it with a ViewState monster! If you’re anal, you can completely remove all traces of ViewState from pages that don’t need it by inheriting from a BasePage such as this:
你做所有工作来减少请求,合并和压缩静态引用,并确保你的代码尽可能的简洁 - 别让ViewState怪兽毁了它!If you’re anal(不知道怎么翻译),你可以继承一个基类页面,从页面完全移除所有的ViewState跟踪,像这样:
/// <summary>
/// BasePage providing cross-site functionality for pages that should not have ViewState enabled.
/// </summary>
public class BasePageNoViewState : Page // Or of course, inherit from your standard BasePage, which in turn inherits from Page
{
protected override void SavePageStateToPersistenceMedium(object viewState)
{
} protected override object LoadPageStateFromPersistenceMedium()
{
return null;
} protected override void OnPreInit(EventArgs e)
{
// Ensure that ViewState is turned off for every page inheriting this BasePage
base.EnableViewState = false;
base.OnPreInit(e);
}
}
教你50招提升ASP.NET性能(二十):7条便利的ViewState技巧的更多相关文章
- 教你50招提升ASP.NET性能(十六):把问题仍给硬件而不是开发人员
(27)Throw hardware at the problem, not developers 招数27: 把问题仍给硬件而不是开发人员 As developers, we often want ...
- 教你50招提升ASP.NET性能(十九):静态集合
(30)Static collections 招数30: 静态集合 If a collection is static, make sure it only contains the objects ...
- 教你50招提升ASP.NET性能(十八):在处理网站性能问题前,首先验证问题是否出在客户端
(29)Before tackling any website performance issue, first verify the problem isn’t on the client 招数29 ...
- 教你50招提升ASP.NET性能(十五):解决性能问题时不要低估UI的价值
(26)Don’t underestimate the value of the UI when tackling performance problems 招数26: 解决性能问题时不要低估UI的价 ...
- 教你50招提升ASP.NET性能(十四):使用startMode属性来减少ASP.NET站点加载时间
(25)Use the startMode attribute to reduce the load time for your ASP.NET site 招数25: 使用startMode属性来减少 ...
- 教你50招提升ASP.NET性能(十):减少通过网络发送的数据
(16)Reduce the data sent across the network 招数16: 减少通过网络发送的数据 Reducing the amount of data sent acros ...
- 教你50招提升ASP.NET性能(十二):在生产环境,仔细考虑你需要记录哪些日志
(18)When in production, carefully consider what you need to log 招数18: 在生产环境,仔细考虑你需要记录哪些日志 Many peopl ...
- 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧
Database Performance Tips for Developers对于开发人员的数据库性能技巧 As a developer you may or may not need to go ...
- 教你50招提升ASP.NET性能(十一):避免在调试模式下运行网站
(17)Avoid running sites in debug mode 招数17: 避免在调试模式下运行网站 When it comes to ASP.NET, one of the most c ...
随机推荐
- 庖丁解牛-----Live555源码彻底解密(RTP解包)
Live555 客户端解包 以testRTSPClient.cpp为例讲解: Medium<-MediaSource<-FramedSource<-RTPSource<-Mul ...
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- memcache的应用场景和实现原理
面临的问题 对于高并发高访问的 Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的 ...
- html5极速3D立体式图片相册切换效果
下载Demo
- 常用的css的技巧
1.在做项目当中,由静态页面来载入到项目中,作为动态数据的部分,若是这个动态数据,前面或者后面有需要图片显示(图片是用background来显示的),一般不用float:left或者right,而是p ...
- Android-AnimationDrawable(三)运行的几种方式
项目开发用到了AnimationDrawable,调用start后没有运行,很纳闷.google搜了下.记录一下. 这个AnimationDrawable.start不能直接写在onClick,onS ...
- excel用vlookup,lookup时查询数据需要排序
如题,排出来的数据不对,之前没有是看清楚..所以记下来,日是后要小心点....
- oracle 统计语句 与常见函数的归纳(未完待续)
一.统计语句 1. count count(*)与count(0)语句的区别: count(*)统计所有数量 count(0)统计第一列不为空的 2. 两个统计量的减法 select (select ...
- android模块化app开发-4为APP减负
现在android应用中一个趋势是应用越来越大,免去游戏不谈普通APP也是一个个的体积直线增长.这里面除了业务增长外各种接口jar包的对接也占了不少比重.像广告SDK,统计SDK,支付SDK等这些我们 ...
- Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务
RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Li ...