Cet article est particulièrement intéressant :
http://www.codeproject.com/KB/viewstate/ViewStateAttribute.aspx
J'ai décidé de le mettre en oeuvre et je dois dire que c'est vraiment très satisfaisant !
Aurevoir les lignes de codes répétitives et bonjour le côté pratique puisque en résumé, pour rendre une propriété persistante dans le ViewState, il vous suffit au final de faire :
[ViewStateProperty]
protected MaPropriete { get; set; }
Et là, je dis... Qui dit mieux ?
Il y a du Linq dans le code proposé, donc, si vous avez besoin de ça pour du .NET <3.0, il faudra adapter un peu le code.
Ainsi le code proposé par l'auteur :
protected MainPage()
{
this.viewStateProperties = GetType().GetProperties(
BindingFlags.NonPublic | BindingFlags.Instance).Where(
p => p.GetCustomAttributes(typeof(ViewStateProperty), true).Length > 0).ToArray();
}
devient sans Linq :
protected MainPage()
{
List<PropertyInfo> final = new List<PropertyInfo>();
PropertyInfo[] liste = GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (PropertyInfo p in liste)
{
if (p.GetCustomAttributes(typeof(ViewStateProperty), true).Length > 0)
{
final.Add(p);
}
}
this.viewStateProperties = final.ToArray();
}
Voici un système simple lorsque vous avez une page longue à charger après un submit (changement de page d'une gridview, recherche, tri...)
Dans la MasterPage :
Loader ce script (que l'on peut mettre dans un fichier .js)
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
addLoadEvent(function() {
document.getElementById("loading").style.display = "none";
});
function waitMessage() {
document.getElementById('loading').style.display = '';
}
jQuery(document).ready(function() {
document.getElementById('loading').style.display = 'none';
});
Modifier le Form ASP.NET de la MasterPage :
<form id="form1" runat="server" onsubmit="javascript:waitMessage();return true;">
.....
<div id="loading"><br /><br />Please wait...<br /><br /><img src="<%=ResolveClientUrl("Images/Animation.gif")%>" /><br /></div>
</form>
Désormais pour toutes les pages longues à charger ... C'est réglé :)
Et voici le CSS :
#loading
{
width: 280px;
height: 100px;
background-color: #c0c0c0;
position: absolute;
left: 50%;
top: 50%;
margin-top: -50px;
margin-left: -100px;
text-align: center;
border:solid 1px black;
border-right: solid 3px black;
border-bottom:solid 3px black;
}