Introduction
Dans cet article, on a voir un aperçu des nouvelles fonctionnalités d’ASP.NET qui sont inclus dans le cadre du Framework .net et Visual Studio 2010.
Les nouvelles fonctionnalités
1. Extensibilité du Output Caching
1.1. Contexte:
Le cache est une zone de la mémoire où sont stockées les opérations et cela dans le but d'améliorer les performances. Lorsque nous avons besoin du cache à nouveau, nous recherchons dans ce dernier contrairement à l'exécution d’une nouvelle opération.
1.2. Problème:
Cette approche bien sûr est limitée au niveau de la mémoire. Si nos serveurs ont un trafic lourd, alors la mémoire consommée par la mise en cache peut rivaliser avec les exigences de la mémoire à partir d'autres applications ou composants propre à cette application web.
1.3. Solution:
Le Extensible Output Caching permet de configurer un ou plusieurs fournisseurs de Output-Cache pour divers mécanismes de persistance, tels que les disques durs (localement ou à distance), le stockage des nuages et could storger.
1.4. Implémentation de la stratégie:
Il est possible de créer un fournisseur personnalisé d’Output-cache comme une classe qui est dérive de ce nouveau type System.Web.Caching.OutputCacheProvider. Par exemple, nous allons créer un fournisseur à l'aide AppFabric (Velocity) comme il est montré dans suivant :
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
namespace WebAppOutputCacheExperiment.OutputCacheProviders
{
public class VelocityCacheProvider : OutputCacheProvider, IDisposable
{
private DataCache dataCache;
const String OutputCacheName = "OutputCache";
public VelocityCacheProvider()
{
DataCacheFactory factory = new DataCacheFactory();
this.dataCache = factory.GetCache(OutputCacheName);
}
public override object Add(string key, object entry, DateTime utcExpiry)
{
this.dataCache.Add(key, entry, utcExpiry - DateTime.UtcNow);
return entry;
}
public override object Get(string key)
{
return this.dataCache.Get(key);
}
public override void Remove(string key)
{
this.dataCache.Remove(key);
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
throw new NotImplementedException();
}
public void Dispose()
{
this.dataCache = null;
}
}
}
|
Exemple 1
- Vous pouvez ensuite configurer le fournisseur dans le fichier Web.config en utilisant la nouvelle sous-section fournisseur de l'élément OutputCache voir exemple suivant:
|
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<add name="VelocityCache" type="WebAppOutputCacheExperiment.OutputCacheProviders.VelocityCacheProvider, WebAppOutputCacheExperiment"/>
</providers>
</outputCache>
</caching>
|
Exemple 2
- En outre, vous pouvez choisir entre différents fournisseurs d’Output-cache pour chaque contrôle et à chaque demande. La meilleure façon de choisir un autre fournisseur d’Output-cache pour les différents UserControl est de le faire de façon déclarative en utilisant l'attribut ProviderName, nouveau dans une directive de contrôle :
|
<%@ OutputCache="" Duration="60" VaryByParam="None" providerName="VelocityCache" %>
|
Exemple 3
- Au lieu de spécifier de manière déclarative le fournisseur, vous pouvez substituez la méthode GetOuputCacheProviderName dans le fichier Global.asax et préciser le fournisseur à utiliser pour une demande spécifique :
|
public override string GetOutputCacheProviderName(HttpContext context)
{
if (context.Request.Path.EndsWith("CacheWebForm.aspx"))
return "VelocityCache";
else
return base.GetOutputCacheProviderName(context);
}
|
Exemple 4
2. Redirection permanente d'une page
2.1. Contexte :
Il est de pratique courante dans les applications Web pour se déplacer dans les pages et dans le contenu au fil du temps, qui peut conduire à une accumulation de liens périmés dans les moteurs de recherche.
2.2. Problème:
Traditionnellement, cela se fait en utilisant la méthode Response.Redirect de transmettre une demande à la nouvelle URL. Toutefois, cette méthode émet un HTTP 302 Found comme réponse, ce qui entraîne un voyage HTTP extra round lorsque les utilisateurs tentent d'accéder aux anciennes URL.
2.3. Solution:
ASP.NET 4 ajoute une méthode RedirectPermanent inédit qui facilite d’émettre HTTP 301 Moved Permanently.
2.4. Implémentation de la stratégie:
|
Response.RedirectPermanent("newlocation/page.aspx");
|
Exemple 5
3. Shrinking Session State
3.1. Contexte :
Dans la pratique courante dans les applications Web d’exploiter la session pour stockée des objets.
3.2. Problème:
Selon la quantité d'information que le développeur veut stocker dans la session, la taille des données sérialisées peut devenir assez grande.
3.3. Solution:
ASP.NET 4 introduit une nouvelle option de compression pour les deux types de prestataires d'état de session out-of-process. Lorsque l'option de configuration compressionEnabled comme le montre l'exemple suivant est à la valeur true, ASP.NET compresse et décompresser la session sérialisé en utilisant le class System.IO.Compression.GZipStream .
|
<sessionState
mode="SQLServer" sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate" allowCustomSqlDatabase="true" compressionEnabled="true"/>
|
Exemple 6
4. Réglage de Meta Tags
4.1. Contexte:
Les balises Meta permettent notamment d’informer la page sur le Web (MetaData), tels que l'auteur, mots clés, contenu, etc.
4.2. Problème:
Nous devons inclure dynamiquement des métadonnées dans nous page, par exemple, à partir d'une source de données relationnelle pour le moteur de recherche afin de donner plus de pertinence à notre site. Il s'agit d'un Search Engine Optimization (SEO).
4.3. Solution:
ASP.NET 4 introduit la MetaKeywords une nouvelle propriété, et MetaDescription à la classe Page. La directive @ Page contient les mots-clés et l'attribut Description.
4.4. Implémentation de la stratégie:
|
<%@ Page="" Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebAppOutputCacheExperiment._Default" Keywords="page par default" Description="description de la page" %>
|
Exemple 7
L’output va être comme ceci :
|
<head id="Head1" runat="server">
<title>Page</title>
<meta name="keywords" content="mots clé de la page" />
<meta name="description" content="description de la page" />
</head>
|
Exemple 8
5. Une meilleur contrôle de la ViewState
5.1. Problème:
L’utilisation de la ViewState pour stocker de grandes quantités de données, provoque une dégradation des performances significative.
5.2. Solution:
ASP.NET 4 introduit la ViewStateMode nouvelle propriété dans les contrôles Web qui vous permet de désactiver l'état d'affichage par défaut et activer ensuite seulement pour les contrôles qui en ont besoin dans la page. Cette propriété peut avoir trois valeurs: Activer, désactiver, et Inherit. Ils notamment possible de définir les ViewStateMode au niveau de la page.
5.3. Implémentation de la stratégie:
|
<%@ Page="" Title="Home" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebAppOutputCacheExperiment._Default" ViewStateMode="Disabled" %>
|
Exemple 9
6. Routage dans ASP.NET 4
6.1. Contexte:
SEO est le moteur de recherche le plus utiliser pour augmenter le trafic sur un site Web,
6.2. Problème:
Comment peut-on configurer les applications utilisant notre formulaire de pages Web pour utiliser l'URL se lie pas à des fichiers physiques sur le serveur?
6.3. Solution:
Bien que les fonctionnalités de routage soient livrées avec ASP.NET 3.5 SP1, ASP.NET 4 est livré avec de nouveaux atouts pour le rendre plus facile utilisation des mécanismes de routage, y compris les suivantes:
· La classe PageRouteHandler, qui est un gestionnaire HTTP simple que vous utilisez lorsque vous définissez les routes. La classe transmet les données vers page demandé.
· Les nouvelles propriétés HttpRequest.RequestContext et Page.RouteData (qui est un raccourci pour HttpRequest.RequestContext.RouteData). Ces propriétés faciliter l'accès à l'information qui est passée de la route.
· Les constructrices suivantes qui sont de nouvelles expressions, qui sont définis dans System.Web.Compilation.RouteUrlExpressionBuilder et System.Web.Compilation.RouteValueExpressionBuilder:
o RouteUrl, qui fournit un moyen simple de créer une URL correspondante à une URL de routage dans un contrôle serveur ASP.NET.
o RouteValue, qui fournit un moyen simple d'extraire des informations de l'objet RouteContext.
· La classe RouteParameter, facilite la transmission de données contenues dans un objet RouteContext à une requête pour une source de données de contrôle (semblable à FormParameter).
6.4. Implémentation de la stratégie :
Ouvrez le fichier Global.asax et ajoutez le code suivant pour lier les produits / catégories / (id) format d'URL avec la page physique ProductsCategory.aspx.
|
Using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Routing;
using System.Web;
namespace WebAppRoutingExperiment
{
public class Global :HttpApplication
{
// New code added
void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("ProductsCategory", "products/category/{id}", "~/ProductsCategory.aspx");
}
void Application_Start(object sender, EventArgs e)
{
// New code added
RegisterRoutes(RouteTable.Routes);
}
}
}
|
Exemple 10
Et enfin, nous allons créer le fichier ProductsCategory.aspx et ajoutez le code pour obtenir la valeur, la catégorie, et l'affichage dans la page.
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace WebAppRoutingExperiment
{
public partial class ProductsCategory :Page
{
protected void Page_Load(object sender, EventArgs e)
{
string productCategoryId = this.Page.RouteData.Values["id"] != null ? this.Page.RouteData.Values["id"].ToString() : "No Product Category";
this.lblProductCategoryId.Text = productCategoryId;
}
}
}
|
Exemple 11
7. Réglage de l’ID de client
7.1. Contexte:
Tous les jours, nous utilisons Ajax et les bibliothèques JavaScript pour créer des Applications Internet Riches (RIA). La nouvelle propriété ClientIDMode traite un problème de longue date dans ASP.NET, à savoir comment créer des contrôles de l'attribut id pour les éléments qu'ils rendent.
Sachant que l'attribut id pour les éléments rendus est important, si votre application contient un script client qui fait référence à ces éléments.
7.2. Problème:
Jusqu'à ASP.NET 4, l'algorithme de génération de l'attribut id de la propriété ClientID était concaténer, le conteneur de dénomination (le cas échéant) avec l'ID, et dans le cas des contrôles répétés (comme dans les contrôles de données), d'ajouter un préfixe et un numéro séquentiel.
Même si cela a toujours garanti que les ID des contrôles dans la page sont uniques, l'algorithme a donné lieu à des ID de contrôle qui n'étaient pas prévisibles, ce qui rond difficile de faire référence dans le script client. Cela se produit surtout quand nous utilisons les pages maîtres.
Une astuce pour obtenir une référence à des éléments HTML comme le montre l’exemple suivant:
|
var btn = document.getElementById("<% =Button1.ClientID %>");
|
Exemple 12
Ou, la solution la plus élégante de jQuery, comme montrer dans l’exemple suivant :
|
var btn = $('<% =Button1.ClientID %>');
|
Exemple 13
7.3. Solution:
ASP.NET 4 introduit de nouvelles propriétés ClientIDMode vous permet de spécifier plus précisément la façon dont l'ID client est généré pour les contrôles. Vous pouvez définir la propriété ClientIDMode pour tout contrôle, y compris pour la page.
Les réglages possibles sont les suivantes:
· AutoID. Ceci est équivalent à l'algorithme de génération de valeurs de propriété ClientID qui a été utilisé dans les versions antérieures d’ASP.NET.
· Statique. Ceci indique que la valeur ClientID sera le même que l'ID, sans la concaténation des identifiants de nommage du conteneur parent. Cela peut être utile dans les UserControl. Parce qu’un UserControl peut être situés sur des pages différentes et dans les contrôles de conteneurs différents, il peut être difficile d'écrire un script client pour les UserControl qui utilisent l'algorithme AutoID parce que vous ne pouvez pas prédire les valeurs d'identité.
· Prévisibles. Cette option est destinée principalement à des contrôles de données qui utilisent des modèles de répétition. Il concatène les propriétés ID de conteneurs de nommage du contrôle, mais la valeur du ClientID générer ne contiennent pas de chaînes de caractères comme "ctlxxx". Ce paramètre fonctionne en conjonction avec la propriété ClientIDRowSuffix. Vous définissez la propriété cette dernière au nom d'un champ de données, et la valeur de ce champ est utilisé comme suffixe pour la valeur générée ClientID. En règle générale vous devez utiliser la clé primaire d'un enregistrement de données comme la valeur ClientIDRowSuffix.
· Hériter. Ce paramètre est le comportement par défaut pour les contrôles, il précise que la production d'un contrôle d'identité est le même que son parent.
7.4. Implémentation de la stratégie :
Un exemple d’AutoID :
|
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:Panel ID="PanelParent" runat="server">
<asp:Panel ID="PanelChild" runat="server">
<asp:TextBox ID="txtEcho" runat="server" ClientIDMode="AutoID" />
</asp:Panel>
</asp:Panel>
</asp:Content>
|
Exemple 14
L’output va être comme ceci :
|
<div id="MainContent_PanelParent">
<div id="MainContent_PanelChild">
<input name="ctl00$MainContent$txtEcho" type="text" id="ctl00_MainContent_txtEcho" />
</div>
</div>
|
Un exemple de Statique
|
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:Panel ID="PanelParent" runat="server">
<asp:Panel ID="PanelChild" runat="server">
<asp:TextBox ID="txtEcho" runat="server" ClientIDMode="Static" />
</asp:Panel>
</asp:Panel>
</asp:Content>
|
L’output va être comme ceci :
|
<div id="MainContent_PanelParent">
<div id="MainContent_PanelChild">
<input name="ctl00$MainContent$txtEcho" type="text" id="txtEcho" />
</div>
</div>
|
L’exemple de Predictable.
|
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:Panel ID="PanelParent" runat="server">
<asp:Panel ID="PanelChild" runat="server">
<asp:TextBox ID="txtEcho" runat="server" ClientIDMode="Predictable" />
</asp:Panel>
</asp:Panel>
</asp:Content>
|
L’output va être comme ceci :
|
<div id="MainContent_PanelParent">
<div id="MainContent_PanelChild">
<input name="ctl00$MainContent$txtEcho" type="text" id="MainContent_txtEcho" />
</div>
</div>
|
8. Chart Control
8.1. Problème :
Vous avez besoin de visualiser les données d'une manière compréhensible dans une application Web, par exemple, un rapport d'analyse financière.
8.2. Solution :
ASP.NET 4 introduit un nouveau chart control avec un ensemble de fonctionnalités tels que la pie, area, range, des points, et la distribution de données avec un support en Ajax. A l'exécution, le contrôle génère une image (un fichier pgn.) Qui est référencé par le côté client.
8.3. Implémentation de la stratégie :
La première étape est d'ajouter un gestionnaire HTTP pour votre application dans le web.config.
|
<httpHandlers>
<add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false" />
</httpHandlers>
|
Exemple 20
Plus tard, nous ajoutons le contrôle Chart à notre page.
|
<asp:Chart ID="Chart1" runat="server" />
|
Exemple 21
La Web Form est affichée dans l’exemple 22..
|
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="SalesByDayOfWeek.aspx.cs" Inherits="WebAppCharting.SalesByDayOfWeek" %>
<%@ Register
Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div>
<h3>Sales Reports (By days of the week)</h3>
</div>
<div>
<asp:Chart ID="chrSalesByDayOfWeek" runat="server" Width="500" Height="350">
<Series>
<asp:Series ChartType="Area" Palette="EarthTones" ChartArea="MainChartArea"></asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="MainChartArea" Area3DStyle-Enable3D="true">
</asp:ChartArea>
</ChartAreas>
</asp:Chart>
</div>
</asp:Content>
|
Exemple 22
Le code-code-behind del Web Form.
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace WebAppChartingExperiement
{
public partial class SalesByDayOfWeek :Page
{
protected void Page_Load(object sender, EventArgs e)
{
Random random = new Random();
string[] listDaysOfWeek = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
foreach (string dayOfWeek in listDaysOfWeek)
{
double totalSales = random.NextDouble() * 5000 + 1000;
this.chrSalesByDayOfWeek.Series[0].Points.AddXY(dayOfWeek, totalSales);
}
}
}
}
|
Exemple 23
Le rapport va être affiché tel qu’il est dans la figure 1 :
Figure 1
Maintenant nous allons alimenter la charte avec des données de manière statique.
|
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="SalesByDayOfWeekStatic.aspx.cs" Inherits="WebAppChartingExperiment.SalesByDayOfWeekStatic" %>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div>
<h3>Sales Reports (By days of the week)</h3>
</div>
<div>
<asp:Chart ID="chrSalesByDayOfWeek" runat="server" Width="500" Height="350">
<Series>
<asp:Series ChartType="Area" Palette="EarthTones" ChartArea="MainChartArea">
<Points>
<asp:DataPoint AxisLabel="Sun" YValues="17" />
<asp:DataPoint AxisLabel="Mon" YValues="15" />
<asp:DataPoint AxisLabel="Tue" YValues="6" />
<asp:DataPoint AxisLabel="Wed" YValues="4" />
<asp:DataPoint AxisLabel="Thu" YValues="3" />
<asp:DataPoint AxisLabel="Fri" YValues="3" />
<asp:DataPoint AxisLabel="Sat" YValues="3" />
</Points>
</asp:Series>
</Series>
<ChartAreas>
<asp:ChartArea Name="MainChartArea" Area3DStyle-Enable3D="true">
</asp:ChartArea>
</ChartAreas>
</asp:Chart>
</div>
</asp:Content>
|
Exemple 24
Le résultat du rapport sera traduit par la figure 2.
Figure 2
Conclusion:
Nous avons vu dans cet articles les principales nouveautés d’APS.NET 4 qui introduite avec l’arrivé du Framework 4. A présent vous pouvez exploiter ces fonctionnalités après cette introduction sur ASP.NET 4.
2bb419eb-ffb1-4d8f-8530-b0f1b0613373|0|.0
ASP.NET AJAX, C#, Visual Studio 2010
asp, net, 4, nouveautés