lundi 30 août 2010

Incorporer une ressources dans une DLL

Bonjour,

Petit billet pour expliquer comment incorporer n'importe qu'elle type de ressources (image, javascript, ...) dans un DLL puis en faire l'appel.

Problème : Comment faire si l'on a plusieurs sites web qui font appel à des même images et script en évitant la répétition ? (copier/coller)

1er élément : le mettre sur un serveur disponible n'importe ou. Du type Google (http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js), qui en interne (en entreprise) n'est pas spécialement le bon choix, on s'orientera plus sur le meme exemple avec nos propres serveurs du style : http://entreprise.intern.fr/ajax/libs/jquery/1.4.2/jquery.min.js.

Cette solution fonctionne parfaitement, mais ce n'est pas celle que j'ai retenu d'expliquer en détails. Le 2nd élément est la mise en place d'une DLL contenant les divers images, scripts nécessaire pour les sites web.

Pour cela nous avons besoins de 2projets (ils peuvent être dans la meme solution ou non).
1. ClassLibrary (bibliothèque de classes)
2. SiteMvc

Dans - ClassLibrary - ajouter une image a la racine du projet (ici worms.jpg) :
Dans les propriétés de l'image (ou de n'importe quelles ressources), changer l'action de génération de "Contenu" en "Ressource incorporée" ! Cette étape est obligatoire !
Ensuite, ajouter une nouvelle classe au projet ClassLibrary (ou ouvrir celle par défaut : Class1.cs). Ajouter en entête de classe :
[assembly: System.Web.UI.WebResource("ClassLibrary.worms.jpg", "image/jpg")]
namespace ClassLibrary
{
    public class Class1
    {

    }
}
Attention, la casse et le namespace/dossier sont très important, sinon depuis vos autres projets vous ne pourrez pas faire l'appel correctement !
Compiler votre 1er projet, il ne doit pas avoir d'erreur.

Maintenant sur votre 2nd projet, ajoutez la référence vers votre DLL ainsi créer. Et depuis l'une de vos vue, ajouter le code suivant pour faire appel a notre image (worms.jpg)

< img src="< % = ClientScript.GetWebResourceUrl(typeof(ClassLibrary.Class1), "ClassLibrary.worms.jpg") % >" / > 

Compilez/Exécuter, tadaaaaaaaa magique l'image des Worms s'affiche sur votre navigateur. Si vous regardez dans le source de la page vous devriez voir l'url peu commune :

< img src="/WebResource.axd?d=haVvUhxQKye3YgyVc9g8l32EYKRgja8RJmuPLLUPaamPyZ8Eyx76lCDu-nUPvlKb0&t=634187628689941128" / >

Voila, c'est tout pour l'instant, j'espère que vous avez appris quelque chose, et que cela vous a servi :)

Coding4Fun

jeudi 26 août 2010

Gestion des Type Enum C#

Bonjour a tous !

De retour de vacances, en forme pour de nouveau épisode de code sur mon Blog ^^. J'espère que pour vous que vos vacances se sont bien passé et que vous avez pu vous reposez et profitez du soleil.

Un petit billet pour faire quelques explication sur les Enum en C#.

Ma question initial était de pouvoir avoir des types défini et comparable en string. Cependant a ma connaissance les Enums n'etaient que comparable avec des int de cette manière :

private enum InputType
{
    Checkbox,
    Hidden,
    File,
    Password,
    Radio,
    Reset,
    Submit,
    Text
}

... InputType.Text == 7 ...

Or, ce que je souhaite c'est de pouvoir afficher le texte de mon Enum (et non la valeur) :

Console.WriteLine("Le champ Text : " + InputType.Text)
// produit : Le champ Text : 7

Pour cela, il faut utiliser les méthodes présentes dans System.Enum : (2 essentiellement)

// Récupération de tous les textes de l'enum en question
var tab = System.Enum.GetNames(typeof(InputType));
// Récupération du texte de l'enum donné
var elm = System.Enum.GetName(typeof(InputType), InputType.Checkbox);

Cependant, une méthode plus courte existe, l'utilisation du .ToString() sur le type donné. Néanmoins, l'intellissence de Visual Studio (2008 - C# 3.5) note que cette méthode est désapprouvée et qu'il faut utiliser System.Enum.ToString() ?!

Ça marche très bien comme cela :

string val = InputType.Text.ToString();