Feb 08

Erreur de ce type : "Uncaught Sys.InvalidOperationException: Sys.InvalidOperationException: Could not find UpdatePanel" :

"Uncaught Sys.InvalidOperationException: Sys.InvalidOperationException: Could not find UpdatePanel with ID 'ctl00_updxxx'. If it is being updated dynamically then it must be inside another UpdatePanel."

Si vous rencontrez cette erreur c'est que vous tentez de masquer (Visible = false) un panel qui contient un update panel. Ou de mettre a jour un update panel qui est dans un panel avec l'attribut visible = false

Deplacer le panel dans l'update panel et ce sera bon !

<asp:UpdatePanel runat="server" ID="updXXX" UpdateMode="Conditional">

            <ContentTemplate>

                <asp:Panel runat="server" ID="pnlXXX" Visible="false">

                          CONTENT

                </asp:Panel>

            </ContentTemplate>

</asp:UpdatePanel>

 

Tags:
Feb 08

Voici le moyen de rendre persistant un view state lors de différents postback au sein de la meme page :

public string TheProperty

{

get

    {

string text = (string)ViewState["TheProperty"];

if (text != null)

return text;

else

return string.Empty;

}

set

{

ViewState["TheProperty"] = value;

}

}

 
Tags:
Jul 27

1) Introduction

Cet article a pour but de présenter l'utilisation d'une GridView modifiable de façon optimal.

L'intérêt est de ne plus utiliser de formulaire pour mettre à jour, ajouter ou supprimer des éléments dans une GridView.

Cet exemple gère des personnes (Nom, prénom, actif, civilité).

Pour simplifier le tutoriel, la base de données sera remplacée par un fichier XML et les couches DAO et Business seront remplacées par une simple classe.

Ce tutoriel sera aussi un rappel sur LINQ to XML.

2) Création de la classe Personne.cs

 Personne.cs (2,46 kb)

3) Création de la classe PersonneBusiness.cs

Cette classe aura pour but de simuler les couches DAO et Business. Elle sera composée de toutes les méthodes CRUD nécessaires.

- GetAll

- GetById

- Insert

- Update 

- Delete

- GetNewId

Classe PersonneBusiness.cs

 PersonneBusiness.cs (7,49 kb)

4) Création de la page web

- Default.aspx

Default.aspx (9,64 kb) 

- Default.aspx.cs

Default.aspx.cs (8,85 kb)

 

Télécharger la solution complète : PhGridView.rar (86,52 kb)

Tags:
Jun 28

Activer les roles dans le web.config (System.Web) :

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />

Ajouter les références suivantes :

using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

1) Récupérer le login de l'utilisateur :

public static string GetUserName()
{
	return HttpContext.Current.User.Identity.Name;
}

2) Récupérer le prénom de l'utilisateur :

public static string GetFirstName()
{
	string principal = GetUserName();
	PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
	UserPrincipal user = UserPrincipal.FindByIdentity(ctx,principal);
	return user.GivenName;
}

A partir de cette méthode, tout est récupérable, il suffit de changer le GivenName par la propriété correspondante.

3) Tester un droit pour l'utilisateur connecté :

Après avoir ajouté cette chaine dans le web.config :

<appSettings>
	……
	<add key="admin" value="Domaine\Droit"/>
</appSettings> 

public static bool UserIsAdmin()
{
	return Roles.IsUserInRole(ConfigurationManager.AppSettings["admin"]);
}
Jun 09

1) Créer les 3 configurations suivantes si elles n’existent pas 

a.       Debug : Par défaut, utilisé sur le poste local du développeur

b.      Deploy : utilisé pour le serveur de développement

c.       Release : utilisé pour le serveur de production

 

 

Pour ajouter une nouvelle configuration, aller dans le gestionnaire de configuration (ci-dessus) 

 

 

Cliquer sur nouveau puis saisir le nom de la nouvelle configuration (ex : Deploy , copier les paramètres à partir de release)

 

2) Une fois les 3 configurations crées il suffit de faire un clique droit sur le fichier web.config puis « Ajouter des transformations de configuration » (Si les fichiers n’ont pas déjà été créés)


3) Modifier les fichiers suivant vos besoins

Exemple : Le cas ou le IIS du serveur de développement est différent du poste du développeur. Il faut déplacer les modules et les handlers.

La section <System.web> du fichier web.config :

<system.web> 

    <pages theme="Defaut"> 

      <controls> 

        <add tagPrefix="…" namespace="…" assembly="…"/> 

      </controls> 

    </pages> 

    <httpModules> 

      <add name="" type="…, …"/> 

    </httpModules> 

    <httpHandlers>

      <add verb="*" path="*.aspx" type=""/>

      <add verb="*" path="*.asmx" type=""/>

    </httpHandlers>

    <compilation debug="true" targetFramework="4.0">

    </compilation>

  </system.web>

  <system.webServer>
  </system.webServer>

La même section dans le fichier Web.Deploy.config :

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web xdt:Transform="Replace">
    <pages theme="Defaut">
      <controls>
        <add tagPrefix="" namespace="" assembly=""/>
      </controls>
    </pages>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
  <system.webServer xdt:Transform="Replace">
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <add name="" type="…, …"/>
    </modules>
    <handlers>
      <add name="" verb="*" path="*.aspx" type="…, …"/>
      <add name="" verb="*" path="….ashx" type="…, …"/>
    </handlers>
  </system.webServer>
</configuration>

Pour remplacer toute une section il faut ajouter l’élément xdt:Transform="Replace"

Pour supprimer un attribut il faut rajouter xdt:Transform="RemoveAttributes(l’attribut à supprimer)"

 

4) Pour publier le site, il suffit de choisir le mode de configuration à mettre en place.

Tags:
Apr 20

Si l'on modifie la page Default.aspx, la redirection des catégories et des tags ne fonctionnera plus.

Cela se produit si l'on désire intégrer un site web au blog par exemple.

Solution :

Dans le code les redirections se font vers la page Default, il faut donc renommer ces redirections vers la nouvelle page.

On va dire que la nouvelle page se nomme blog.aspx et que la page Default.aspx n'est plus lié au blog.

1) Il faut travailler sur le code source de BlogEngine :

- Ouvrir le fichier /Web/HttpModules/UrlRewrite.cs

- Renommer default.aspx par blog.aspx, SAUF le bloc à partir de la ligne 238 (pour la version 2.5, à 8 endroits environ) :

else 

{

string newUrl = url.Replace("Default.aspx""default.aspx");  // fixes a casing oddity on Mono
int defaultStart = url.IndexOf("default.aspx"StringComparison.OrdinalIgnoreCase);
newUrl = Utils.ApplicationRelativeWebRoot + url.Substring(defaultStart);
 
context.RewritePath(newUrl);
}
 

- Rajouter devant ?tag le nom du nouveau fichier, à la ligne 198 : ?tag remplacer par : blog.aspx?tag

- Ouvrir le fichier /Web/Controls/PostViewBase.cs

- Rajouter devant ?tag le nom du nouveau fichier, à la ligne 343 : ?tag remplacer par blog.aspx?tag

- Compiler la solution, remplacer la DLL BlogEngine.Core.dll par la nouvelle (BlogEngine.NET 2.5 (source)\BlogEngine\BlogEngine.NET\Bin) au site web

2) Dans le site web

- Ouvrir le fichier App_Code/Controls/TagCloud.cs

Rajouter devant ?tag le nom du nouveau fichier, à la ligne 138 : ?tag remplacer par blog.aspx?tag

- Idem pour le fichier widgets/Tag cloud/widget.ascx.cs


3) Publier les nouveaux fichiers

Si un problème persiste, faire une recherche sur la solution complète avec les termes default.aspx et ?tag pour vérifier si tout à été renommé.

Tags:
Feb 23

Quelques conseils pour améliorer le référencement de votre site ASP.NET, d'autres points seront bientot abordés.

1) Le choix du nom de domaine

2) Le nom des liens passés dans l'url est très important, l'url rewriting doit être utilisé

3) Préférer les "<div>" aux "<table>", surtout pas de "<table>" dans un autre "<table>"

4) Avoir un site validé par le W3C : utiliser cet outil : http://validator.w3.org/

5) Pour les images, renseigner l'attribut "alt"

6) Puur les liens de type "href" utiliser l'attribut "title"

7) Eviter les introductions et les menus de type Silverlight ou Flash

8) Utiliser les balises "<h1>" à "<h6>" en fonction de l'importance des mots clés

9) Faire venir les utilisateurs par d'autres sites

10) Ne pas utiliser la balise "<style>" au sein des pages, préférer les feuilles de styles externes CSS

11) Idem pour les javascript, préférer les fichiers .js

12) Limiter, voir éviter les commentaires dans les pages aspx 

13) Ne pas utiliser le ViewState si il n'est pas neccessaire

14) Ne pas utiliser <form runat=server"> si il n'est pas necessaire

15) Utiliser un siteMap.xml compatible avec les moteurs de recherche : http://sitemaps.org/fr/

16) Utiliser des titres de pages simple avec les mots clés correspondant au contenu de la page

17) Changer les titres des pages dynamiquement en fonction du contenu :

      HtmlTitle title = new HtmlTitle();

      title.Text = "Votre titre";

18) Vous pouvez ausse changer les balises meta dynamiquement, mais la plupart des moteurs de recherche ne les utilisent plus

19) Changer le contenu du site régulièrement

Jan 08

Voici les bases pour implémenter un client/serveur TCP en c# :

Le client :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net.Sockets;

using System.IO;

 

public class Client

{

    public static void Main(string[] args)

    {

        try

        {

            string adresseIp = "Votre IP";

            int port = 8001;

 

            TcpClient client = new TcpClient();

            Console.WriteLine("Connexion.....");

            client.Connect(adresseIp, port);

            Console.WriteLine("Connecté");

           

            string chaineAenvoyer = string.Empty;

            while (chaineAenvoyer.ToLower() != "quit")

            {

                Console.WriteLine("\nChaine a envoyer : ");

                chaineAenvoyer = Console.ReadLine();

 

                Stream stream = client.GetStream();

                ASCIIEncoding encoding = new ASCIIEncoding();

 

                byte[] byteAenvoyer = encoding.GetBytes(chaineAenvoyer);

                Console.WriteLine("Transmission.....");

                stream.Write(byteAenvoyer, 0, byteAenvoyer.Length);

                byte[] byteEnvoyes = new byte[100];

                int nbBytes = stream.Read(byteEnvoyes, 0, 100);

                for (int i = 0; i < nbBytes; i++)

                {

                    Console.Write(Convert.ToChar(byteEnvoyes[i]));

                }

            }

 

            client.Close();

        }

        catch (Exception e)

        {

            Console.WriteLine("Erreur : " + e.StackTrace);

        }

    }

}

Le serveur :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;

 

public class Server

{

    public static void Main(string[] args)

    {

        try

        {

            string adresseIp = "Votre IP";

            int port = 8001;

 

            IPAddress ipAd = IPAddress.Parse(adresseIp);

            TcpListener listener = new TcpListener(ipAd, port);

 

            listener.Start();

            Console.WriteLine("Le serveur écoute sur le port " + port + " ...");

            Console.WriteLine("Le point de terminaison local est :" + listener.LocalEndpoint);

            Console.WriteLine("Attente d'une connexion.....");

 

            Socket socket = listener.AcceptSocket();

            Console.WriteLine("Connexion acceptee de " + socket.RemoteEndPoint);

 

            string motRecu = string.Empty;

 

            while (motRecu.ToLower() != "quit")

            {

                motRecu = string.Empty;

                Console.WriteLine("Reception...");

 

                byte[] byteRecu = new byte[100];

                int nbBytes = socket.Receive(byteRecu);

                for (int i = 0; i < nbBytes; i++)

                {

                    motRecu += Convert.ToChar(byteRecu[i]);

                }

                Console.Write(motRecu);

 

                if (motRecu == "alien")

                {

                    Console.WriteLine("");

                    Console.WriteLine(@"      _       _");

                    Console.WriteLine(@"     (_\     /_)");

                    Console.WriteLine(@"       ))   ((");

                    Console.WriteLine(@"     .-'''''''-.  ");

                    Console.WriteLine(@" /^\/  _.   _.  \/^\");

                    Console.WriteLine(@" \(   /__\ /__\   )/");

                    Console.WriteLine(@"  \,  \o_/_\o_/  ,/");

                    Console.WriteLine(@"    \    (_)    /");

                    Console.WriteLine(@"     `-.'==='.-'");

                    Console.WriteLine(@"      __) - (__  ");

                    Console.WriteLine(@"     /  `~~~`  \");

                    Console.WriteLine(@"    /  /     \  \");

                    Console.WriteLine(@"    \ :       ; /");

                    Console.WriteLine(@"     \|==(*)==|/");

                    Console.WriteLine(@"      :       :");

                    Console.WriteLine(@"       \  |  /");

                    Console.WriteLine(@"     ___)=|=(___");

                    Console.WriteLine(@"    {____/ \____}");

                }

                ASCIIEncoding encoding = new ASCIIEncoding();

                socket.Send(encoding.GetBytes("La chaine a ete recue par le serveur."));

                Console.WriteLine("\nEnvoi de l'acknowledgement");

 

            }

            socket.Close();

 

           listener.Stop();

        }

        catch (Exception e)

        {

            Console.WriteLine("Erreur : " + e.StackTrace);

        }

    }

}

 

Pour tester il suffit de lancer le serveur dans un premier temps puis le client.

Les messages seront saisis dans le client puis affichés dans le serveur.

Pour quitter l'application il suffit d'entrer la commande "quit".

Pour afficher un petit dessin il faut taper la commande "alien" ! (pour le fun)

 

Ceci est la base d'un client serveur TCP. A partir de cette base on peut imaginer de nombreuses implémentations. 

 

 

 

 

Tags:
Oct 29

A) Le service

1) Ouvrir Visual Studio et créer un nouveau projet : Application du service WCF et nommer le projet UsersServices.

2) Supprimer les fichiers IService1.cs et Service1.svc

3)  Créer une simple base de données. Clique droit sur le dossier App_Data et ajouter un nouvel élément.

Sélectionner Base de données SQL Server et la nommer DataBase.mdf. Ouvrir la table en double cliquant dessus. Puis aller dans l’explorateur de serveurs pour y ajouter une table. Clique droit sur tables, ajouter une nouvelle table avec les champs suivant :

-          Id de type int, non null et IsIdentity (auto Incrémenté)

-          Nom de type varchar(50)

-          Prénom de type varchar(50)

Enregistrer cette table sous le nom Users.

4) Ajouter un WCF service à l’application. Clique droit sur le projet, ajouter un nouvel élément, Service WCF puis le nommer UsersService. Plusieurs fichiers ont étés créés.

5)  Ajouter la chaine de connexion au fichier web.config. L’ouvrir puis ajouter cette ligne dans la balise ConnectionStrings:

<connectionStrings>

 <add name="UsersConnectionString"

connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DataBase.mdf; Integrated Security=True;User Instance=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

6) Ouvrir le fichier IUsersService.cs et ajouter un Contrat de données

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;;

namespace UsersServices

{

    [DataContract]

    public class User

    {

        [DataMember]

        public int UserId { get; set; }

 

        [DataMember]

        public string UserName { get; set; }

 

        [DataMember]

        public string UserFirstName { get; set; }

    }

}

7) Ajouter l’interface de la classe User

[ServiceContract]

    public interface IUsersService

    {

        [OperationContract]

        User GetUser(int userId);

 

        [OperationContract]

        void SaveUser(User user);

    }

 

IUsersService.cs doit ressembler à ceci :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;

namespace UsersServices

{

    [DataContract]

    public class User

    {

        [DataMember]

        public int UserId { get; set; }

 

        [DataMember]

        public string UserName { get; set; }

 

        [DataMember]

        public string UserFirstName { get; set; }

    }

 

    [ServiceContract]

    public interface IUsersService

    {

        [OperationContract]

        User GetUser(int userId);

 

        [OperationContract]

        void SaveUser(User user);

    }

}

8) Ouvrir le fichier UsersService.svc et rajouter les using suivants :

-          System.Data

-          System.Data.SqlClient

-          System.Configuration

Ajouter le code permettant d’établir la connexion à la base et implémenter les méthodes GetUser et SaveUser. (Pour avoir le squelette des méthodes, Clique droit sur IUsersService puis sur implémenter l’interface dans :  public class UsersService : IUsersService

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

 

namespace UsersServices

{

    public class UsersService : IUsersService

    {

        private string _connectionString = ConfigurationManager.ConnectionStrings["UsersConnectionString"].ToString();

 

        public User GetUser(int userId)

        {

            string strSql = "SELECT Id, Nom, Prenom FROM users WHERE (Id=@userId)";

 

            SqlConnection connect = new SqlConnection(_connectionString);

            SqlCommand cmd = new SqlCommand(strSql, connect);

            cmd.Parameters.Add("userId",SqlDbType.Int,0).Value = userId;;

 

            SqlDataAdapter sda = new SqlDataAdapter(cmd);

            DataSet ds = new DataSet();

            sda.Fill(ds);

 

            User _user = new User();

            _user.UserId = userId;

            _user.UserName = ds.Tables[0].Rows[0]["Nom"].ToString();

            _user.UserFirstName = ds.Tables[0].Rows[0]["Prenom"].ToString();

 

            return _user;

        }

 

        public void SaveUser(User user)

        {

            string strSql = "INSERT INTO users (Nom,Prenom) VALUES (@nom,@prenom)";

 

            SqlConnection connect = new SqlConnection(_connectionString);

            SqlCommand cmd = new SqlCommand(strSql, connect);

            cmd.Parameters.Add("nom", SqlDbType.VarChar,50).Value = user.UserName;

            cmd.Parameters.Add("prenom", SqlDbType.VarChar, 50).Value =

user.UserFirstName;

 

            connect.Open();

            cmd.ExecuteNonQuery();

            connect.Close();

        }

    }

}

9) Compiler le Service, vérifier qu’il n’y a pas d’erreur puis lancer l’application pour voir ses détails.

B) Le consommateur du service

1) Ajouter un nouveau site web à la solution. Clique droit sur la solution, ajouter, nouveau site web. Puis le nommer UsersClient. Faire un clique droit sur le site et définir comme projet de démarrage.

2) Ajouter la référence au service WCF. Clique droit sur le site, ajouter une référence de service puis Découvrir. Renseigner comme Espace de noms : UsersService.

3) Ouvrir la page default.aspx et ajouter les contrôles nécessaires à l’exécution, pour obtenir une page de ce style :

Code de la page default.aspx :

<table>

<tr>

<td colspan="3" align="center">Recherche d'un User</td>

</tr>

<tr>

<td>ID :</td>

<td>

<asp:TextBox runat="server" ID="txtSearchId"></asp:TextBox>

</td>

<td>                   

<asp:Button runat="server" ID="btnSearch" Text="Rechercher" OnClick="btnSearch_Click" />

</td>

</tr>

<tr>

<td colspan="3"><hr /> </td>

</tr>

<tr>

<td>Nom :</td>

<td>

                    <asp:TextBox runat="server" ID="txtSearchNom"></asp:TextBox>

</td>

            </tr>

<tr>

<td>Prénom :</td>

<td>

<asp:TextBox runat="server" ID="txtSearchPrenom"></asp:TextBox>

</td>

</tr>

<tr>

<td colspan="3" align="center">

<asp:Label runat="server" ID="lblMess" ForeColor="Green"></asp:Label>

</td>

</tr>

<tr>

<td colspan="3" align="center"> Ajout d'un User</td>

</tr>

<tr>

<td colspan="3"><hr /></td>

</tr>

<tr>

<td>Nom :</td>

<td>

<asp:TextBox runat="server" ID="txtNom"></asp:TextBox>

</td>

            </tr>

<tr>

<td>Prénom :</td>

<td>

<asp:TextBox runat="server" ID="txtPrenom"></asp:TextBox>

</td>

</tr>

<tr>

<td colspan="3" align="center">

<asp:Button runat="server" ID="btnAdd" Text="Ajouter"

OnClick="btnAdd_Click" />

</td>

</tr>

</table>


Code Behind :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class _Default : System.Web.UI.Page

{

    protected void btnSearch_Click(object sender, EventArgs e)

    {

        try

        {

            int userId = int.Parse(txtSearchId.Text);

            UsersService.UsersServiceClient _usersService =

new UsersService.UsersServiceClient();

 

            UsersService.User _user = new UsersService.User();

            _user = _usersService.GetUser(userId);

 

            txtSearchNom.Text = _user.UserName;

            txtSearchPrenom.Text = _user.UserFirstName;

            lblMess.Text = string.Empty;

        }

        catch (NullReferenceException)

        {

            lblMess.Text = "Aucun User ne correspond avotre recherche";

        }

    }

 

    protected void btnAdd_Click(object sender, EventArgs e)

    {

        try

        {

            UsersService.UsersServiceClient _usersService = new UsersService.UsersServiceClient();

            UsersService.User _user = new UsersService.User();

 

            _user.UserName = txtNom.Text;

            _user.UserFirstName = txtPrenom.Text;

 

            _usersService.SaveUser(_user);

 

            txtNom.Text = string.Empty;

            txtPrenom.Text = string.Empty;

            lblMess.Text = "User ajouté avec succès";

        }

        catch (Exception ex)

        {

            lblMess.Text = ex.Message;

        }

    }

}

4) Lancer l’application en ajoutant dans un premier temps un User (la base étant vide), dans le panel du bas.

5) Vous pouvez ensuite faire une recherche par l'identifiant.

Il s'agit d'un exemple simplifié pour comprendre le fonctionnement de WCF, il faudra donc rajouter beaucoup de contrôles et de méthodes pour avoir une application fiable. 

Tags:
Oct 21

using System.Diagnostics;

Stopwatch sw = new Stopwatch();

sw.Start();

« La méthode à exécuter »

sw.Stop();

Console.WriteLine("Temps d'éxécution : " + sw.Elapsed.Minutes + " minutes, " + sw.Elapsed.Seconds + " secondes, " + sw.Elapsed.Milliseconds + " milliseconds");

Tags: