jeudi 25 février 2010

Page d'erreur personnalisée en Asp.Net

Voici un article détaillé sur la capture et la gestion d’erreur en Asp.Net.
L’article aborde :
  • Capture au niveau de la page
    protected override void OnError(EventArgs e)
  • Capture au niveau de l’application (virtual directory)
    OnApplication_Error dans global.asax
  • CustomError dans le Web.Config
<customErrors
       mode="RemoteOnly" 
       defaultRedirect="~/errors/GeneralError.aspx" 
/>
  • Clearing des erreurs.
  • Gestion d’erreur dans un HttpModule
    L’implémentation d’un HttpModule (IHttpModule) permet d’effectuer des pré et post processing des requêtes (et d’en modifier le contenu).
  • Capture d’erreur (Analyse That) pour analyse ou notification.
  • Interception des requêtes « wrong url » et page html inexistante par le module Asp.Net (nécessite une modification de la configuration).

jeudi 18 février 2010

Intercepter les requêtes entrantes en ASP.NET

L'interception des requêtes entrante en Asp.Net prend place dans le fichier Global.Asax.
Global.Asax - Application_BeginRequest
Permet d’intercepter les appels, cependant, l’objet session n’est pas encore disponible.
Plus d'info.

Global.Asax – Application_PreRequestHandlerExecute
C’est la place la plus sur pour intercepter les appels avant l’appel de la page.
A ce stade, l’objet session est disponible (mais pas dans toutes les conditions).
Attention:
PreRequestHandlerExecute intercepte tous les appels sur l’application (CSS et image inclus, dans ce cas Session n’est pas disponible).
Il existe également des cas ou HttpContext.Current n’est pas accessible.

Plus d'information sur l'article Working with ASP.NET global.asax file ou ce ce billet.

Voici un petit bout de code issus de mes quelques premiers tests dans global.asax
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    // Code that runs when a new session is started
    HttpContext ctx = HttpContext.Current;
    if( ctx != null )
    if( ctx.Request.Url.ToString().ToLower().IndexOf( ".asp" ) > 0 ) // incomming request must be asp page
    if( ctx.Request.Url.ToString().ToLower().IndexOf( "default.asp" ) <= 0 ) // incomming request cannot be defautlt.asp
    if (Session["username"] == null)
    {
        if (Session["username"] == null)
        {
            string sJumpUrl = ctx.Request.Url.ToString();
            Session["AfterLoginUrl"] = sJumpUrl;
            // Display the Login Box instead
            Server.Transfer("Default.aspx");
        }              
    }
}

dimanche 14 février 2010

Les "méchantes" bonnes personnes

Voici un petit texte que j'ai découvert chez une thérapeute il y a plusieurs années.
Texte qui, en tant que parent, me parle.
Après l'avoir entièrement retapé, je découvre aujourd'hui qu'il a déjà plusieurs fois fait le tour d'Internet ces dernières années.
Voici ma petite contribution... pour que certaines valeurs ne se perdent pas.

Un jour, quand mes enfants seront assez vieux, pour comprendre la logique qui motive un parent, je vais leur dire, comme mes parents méchants m'ont dit:

Je t'ai aimé assez pour te demander où tu allais, avec qui, et quand tu serais de retour à la maison...

Je t'ai aimé assez pour être patiente jusqu'à ce que je découvres que ta nouvelle meilleure amie ou ton grand copain, n'était pas fréquentable...

Je t'ai aimé assez pour me tenir plantée là dans le cadre de la porte pendants deux heures tandis que tu nettoyais ta chambre, une affaire de 15 minutes en principe!

je t'ai aimé assez pour te laisser voir la colère, la déception et les larmes dans mes yeux. Les enfants doivent apprendre que leurs parents ne sont pas parfaits.

je t'ai aimé assez pour te laisser assumer la responsabilité de tes actions même lorsque les pénalités étaient si dures qu'elles ont presque brisé mon coeur.

Mais surout, je t'ai aimé assez pour dire NON même quand je savais que tu me détesterais pour ça.
Telles étaient mes batailles les plus difficiles de toutes.

Je suis heureuse de les avoir gagnées, parce qu'à la fin, tu y a gagné aussi.

Et un jour, quand tes enfants seront assez vieux pour comprendre la logique qui motive les parents "méchants", tu leur diras:

Vos parents étaient ils "méchants"?
Les miens l'étaient.

J'ai eu les parents les plus méchants du monde entier!

Pendant que d'autres enfants mangeaient des sucreries pour les repas, j'ai du manger des céréales, des fruits et des légumes.

Quand d'autres ont eu du Coca et des hamburgers pour le dîner, j'ai dû manger de la viande, du fromage, des crudités et des fruits... ou les tartines de la maison!
Sans oublier toutes ces crêpes et gateaux que ma maman nous a fait...

En vous pouvez deviner que ma mère m'a fait des dîners qui étaient différents de celui des autres enfants.

Mes parents ont insisté pour savoir où j'étais en tout temps.
On aurait pu croire que j'étais enfermée dans une prison.
Ils devaient savoir qui mes amis étaient et ce que je faisais avec eux.

Ils insitaient, si je disais que je serais partie pour une heure, pour que ce soit seulement une heure ou moins.

J'avais honte de l'admettre, mais mes parents ont enfreint la loi sur la protection des enfants concernant le travail en me faisant travailler.
J'ai dû faire la vaisselle, mon lit (quelle horreur!), apprendre à faire la cuisine, passer l'aspirateur, faire mon lavage, vider les poubelles et toutes sortes d'autres travaux cruels.

Je pense qu'elle se réveillait la nuit pour imaginer de nouvelles tâches à me faire faire...

Ils ont toujours insisté pour que je dise la vérité, juste la vérité et rien que la vérité.
Au moment où je suis devenue adolescente, ils pouvaient lire dans mon esprit et avait des yeux tout le tour de la tête.

Puis la vie est devenue vraiment dure!

Mes parents ne laissaient pas mes amis juste klaxonner quand ils venaient me chercher.
Ils devaient venir à la porte pour qu'elle puisse les rencontrer.

Pendant que chacun pouvait fréquenter un ou une petit(e) ami(e) quand ils avaient 12 ou 13 ans, j'ai dû attendre d'avoir 16 ans.

A cause de mes parents, j'ai manqué beaucoup de choses que d'autres enfants ont expérimenté.

Je n'ai jamais été prise pour vol à l'étalage, vandalisme, alcoolisme, ni même arrêtée pour tout autre crime.

C'était "tout de sa faute".
Maintenant que j'ai quitté la maison, je suis instruite et une adulte honnête.

Je fais de mon mieux pour être un parent "méchant" comme mes parents l'étaient.

Je pense que "c'est" ce qui ne va pas avec le monde aujourd'hui.
Il n'y a pas assez de parents méchants!

PASSEZ CE TEXTE A TOUS LES PARENTS MECHANTS QUE VOUS CONNAISSEZ (et leurs enfants!).

Merci donc à tous les parents qui ont été assez méchants dans notre jeunesse pour nous apprendre à être de "méchantes" bonnes personnes!

Emma

Dans la vie, construire n'est pas facile

Petite phrase tirée du dernier roman de Dan Brow (le Symbole Perdu) mais malheureusement tellement vraie:
Il est toujours plus facile de détruire que de construire.
Le symbole Perdu
Dan Brown
Pg 584 

Sur le plan personnel ou social, je préfère "construire". C'est malheureusement une attitude/valeur moins répandue de nos jours.
Et quelque-fois, il faut savoir faire face aux jalousies d'autres qui, souvent, use de la destruction pour asseoir leur supériorité. 

jeudi 4 février 2010

DataBinding en ASP.NET

Moi qui croyait en avoir terminé avec les développements Web, je m'y retrouve encore un petit peu... mais bon c'est franchement plus intéressant de produire une application Web en Asp.Net qu'avec un module ISAPI sous Windows.

Voici donc quelques sources d'information concernant le codage du data-binding en Asp.Net.
Fonction code-behind pour data binding.
Voici un exemple de fonction code-behind appelée depuis une colonne template (dans un DataGrid).
/// <summary>
/// CodeBehind function called from Quantity column DataBinding Expression
/// </summary>
/// <param name="o">System.Data.DataRowView obtained from Contained.DataItem</param>
/// <returns>The new quantity value to be displayed within an edit field</returns>
protected string ExtractNewQuantity( object o ){
     DataRowView drv = (DataRowView)o;
     DataRow row = drv.Row;
     return row["Mail"].ToString();
}

Appel de la fonction behind depuis la page Asp.Net
<asp:TemplateField HeaderText="New Quantity">
  <ItemTemplate>
    <asp:TextBox ID="TextBox2" runat="server" 
      Text="<%# ExtractNewQuantity(Container.DataItem) %>"></asp:TextBox>
  </ItemTemplate>
</asp:TemplateField> 

Autres exemples de binding expression sur un DataSource
A noter que Container.DataItem est un System.Data.DataRowView
<td>
  <a href="mailto://<%# Eval("Mail") %>">
    <asp:Label ID="LoginLabel" runat="server" Text='<%# Eval("Login") %>' />
  </a>
</td>
<td>
  <asp:Label ID="NomLabel" runat="server" Text='<%# DataBinder.Eval( Container.DataItem, "Nom") %>' />
</td>