Développement d’une application de gestion de contacts avec asp. Net mvc (C#)








télécharger 78.86 Kb.
titreDéveloppement d’une application de gestion de contacts avec asp. Net mvc (C#)
date de publication06.11.2016
taille78.86 Kb.
typeDocumentos
ar.21-bal.com > droit > Documentos
Haut du formulaire

Développement d’une application de gestion de contacts avec ASP.NET MVC (C#)

Etape #7 – Ajout du support d’Ajax

Dans cette étape


Nous allons ici revoir l’architecture de l’application afin d’utiliser la technologie Ajax. Grâce à Ajax, nous allons rendre notre application plus performante. Nous allons en effet éviter de générer à nouveau entièrement la page lorsque nous avons uniquement besoin de mettre à jour une certaine région de celle-ci.

Ainsi, nous allons revoir la vue Index pour ne pas avoir à réafficher la page entière lorsque quelqu’un sélectionne un nouveau groupe de contacts. Au lieu de cela, lorsqu’un utilisateur cliquera sur un groupe de contacts, nous nous occuperons juste de mettre à jour la liste des contacts associés et de laisser le reste de la page telle quelle.

Nous allons également changer la manière dont nos liens de suppression fonctionnent. Au lieu d’afficher une page de confirmation séparée, nous allons afficher une boîte de dialogue en JavaScript. Si vous confirmez que vous souhaitez réellement supprimer un contact, une opération HTTP DELETE sera effectuée sur le serveur afin de le supprimer de la base de données.

De plus, nous allons tirer partie de la technologie jQuery pour ajouter des effets d’animation à notre vue Index. Nous afficherons une animation lorsque qu’une nouvelle liste de contacts sera récupérée depuis le serveur par exemple.

Pour terminer, nous bénéficierons du framework AJAX d’ASP.NET pour gérer correctement l’historique du navigateur. Nous créerons des points d’historique dès que nous effectuerons des appels Ajax pour mettre à jour la liste des contacts. Ainsi, les boutons d’historique retour/avant du navigateur fonctionneront comme attendu.

Pourquoi utiliser Ajax ?


L’utilisation d’Ajax apporte de nombreux bénéfices. Tout d’abord, l’ajout d’Ajax à une application apporte une meilleure expérience utilisateur. Dans une application Web classique, la page entière doit être renvoyée au serveur à chaque fois que l’utilisateur effectue la moindre action. Ainsi, quoique vous fassiez, le navigateur se bloque et l’utilisateur doit attendre que la page soit retournée par le serveur et affichée à nouveau.

Cela constituerait une expérience inacceptable dans le cas d’une application de bureau. Cependant, nous avons fini par nous habituer à cette mauvaise expérience dans le cas d’une application Web car nous ne savions pas que nous pouvions mieux faire. Nous pensions que cela était lié aux limitations intrinsèques des applications Web. En fait, c’était juste une limitation de notre propre imagination.

Avec une application Ajax, vous n’avez pas besoin de bloquer le navigateur et l’expérience utilisateur juste pour mettre à jour une page. Au contraire, vous pouvez effectuer une requête asynchrone en arrière-plan pour effectuer cette mise à jour. Vous ne forcez ainsi pas l’utilisateur à patienter pendant qu’une partie de la page est en cours de mise à jour.

En tirant partie d’Ajax, vous pouvez également améliorer les performances de votre application. Regardez comment l’application Contact Manager fonctionne actuellement sans la présence de fonctionnalités Ajax. Lorsque vous cliquez sur un groupe de contacts, la vue Index entière doit être réaffichée. La liste des contacts et la liste des groupes de contacts doivent être rechargées depuis la base de données. Toutes ces données doivent ainsi être transférées sur le réseau depuis le serveur Web vers le navigateur.

Après l’ajout des fonctionnalités Ajax à notre application, nous pourrons ainsi éviter de recharger la page entière lorsqu’un utilisateur cliquera sur un groupe de contacts. Nous n’aurons plus besoin de charger les groupes de contacts depuis la base de données. Nous n’aurons plus besoin non plus de pousser la vue Index entière sur le réseau. En bénéficiant d’Ajax, nous réduisons ainsi la quantité de travail effectuée par notre base de données et nous réduisons également le trafic réseau nécessaire pour notre application.

N’ayez pas peur d’Ajax


Certains développeurs évitent d’utiliser Ajax car ils ont peur du comportement de leurs applications au sein de certains navigateurs. Ils veulent être sûrs que leurs applications Web fonctionnent encore lorsqu’elles seront accédées depuis un navigateur qui ne supporte pas JavaScript. Or, comme Ajax est fondé sur JavaScript, certains développeurs ne souhaitent par conséquence pas utiliser Ajax.

Cependant, si vous faîtes attention à la manière d’implémenter Ajax, vous pouvez développer des applications qui pourront fonctionner avec les 2 niveaux de navigateurs. Ainsi notre application Contact Manager pourra fonctionner avec les navigateurs supportant JavaScript et les navigateurs ne le supportant pas.

Si vous utilisez notre application de gestion de contacts avec un navigateur supportant JavaScript alors vous aurez une meilleure expérience utilisateur. Par exemple, lorsque vous cliquerez sur un groupe de contacts, uniquement la partie de la page correspondante sera mise à jour.

Si, d’un autre coté, vous utilisez l’application avec un navigateur ne supportant pas JavaScript (ou si JavaScript a été désactivé) alors vous aurez une expérience un peu moins attirante. Ainsi, lorsque vous cliquerez sur un groupe de contacts, la page Index entière sera renvoyée vers le navigateur afin d’afficher la liste correspondante de contacts.

Ajouter les fichiers JavaScript requis


Nous aurons besoin d’utiliser 3 fichiers JavaScript pour ajouter les fonctionnalités Ajax à notre application. L’ensemble de ces 3 fichiers sont inclus dans le répertoire Scripts d’une nouvelle application ASP.NET MVC.

Si vous prévoyez d’utiliser Ajax dans plusieurs pages de votre application alors il apparaît logique d’inclure ces fichiers au sein de la page maître de votre application. Ainsi, les fichiers JavaScript seront automatiquement inclus dans l’ensemble des pages de votre application.

Ajoutez les inclusions JavaScript suivantes au sein du tag de votre page maître :






Refonte de la vue Index pour utiliser Ajax


Commençons par modifier la vue Index de manière à mettre à jour uniquement une partie de la page lorsque l’on clique sur un groupe de contacts. Le rectangle rouge de la Figure 1 présente la région que l’on souhaite mettre à jour.

updating only contacts

Figure 01: Mise à jour uniquement des contacts

La première étape est de séparer la partie de la vue que l’on souhaite mettre à jour de manière asynchrone dans une zone séparée avec l’utilisation d’un user control (.ascx). Ainsi la section de la vue Index s’occupant d’afficher la table des contacts a été transférée dans le contrôle ASCX du Listing 1.

Listing 1 – Views\Contact\ContactList.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%@ Import Namespace="Helpers" %>























<% foreach (var item in Model.Contacts)

{ %>















<% } %>





Edit



Delete



Name



Phone



Email



'>edit



'>edit



<%= Html.Encode(item.FirstName) %>

<%= Html.Encode(item.LastName) %>



<%= Html.Encode(item.Phone) %>



<%= Html.Encode(item.Email) %>



Notez que la vue partielle du Listing 1 utilise un modèle différent de celui de la vue principale. L’attribut Inherits de la directive <%@ Page %> spécifie que la vue partielle hérite de la classe ViewUserControl.

La vue Index principale mise à jour est contenue dans le Listing 2.

Listing 2 – Views\Contact\Index.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import Namespace="Helpers" %>



Index





    <% foreach (var item in Model.Groups) { %>

  • >

    <%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList"})%>



  • <% } %>





<% Html.RenderPartial("ContactList", Model.SelectedGroup); %>


 




Il y a 2 choses à noter dans la vue mise à jour du Listing 2. Tout d’abord, notez que tout le contenu déplacé dans la vue partielle a été remplacé par un appel à Html.RenderPartial(). La méthode Html.RenderPartial() est appelée lorsque la vue Index est demandée pour la 1ère fois afin d’afficher la liste des contacts.

Par ailleurs, notez que la méthode Html.ActionLink() utilisée pour afficher les groupes de contacts a été remplacée par un appel à Ajax.ActionLink(). Ajax.ActionLink() est appelée avec les paramètres suivants :

<%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList"})%>

Le 1er paramètre indique le texte à afficher pour le lien, le 2ème paramètre les valeurs à passer et le 3ème paramètre les options Ajax. Dans notre cas, nous utilisons l’option UpdateTargetId pour viser le tag HTML
que nous souhaitons mettre à jour une fois la requête Ajax terminée. Nous voulons ainsi mettre à jour le tag
avec la nouvelle liste de contacts.

La méthode Index() mise à jour pour le contrôleur Contact se trouve dans le Listing 3.

Listing 3 – Controllers\ContactController.cs (méthode Index)

public ActionResult Index(int? id)

{

// Get selected group

var selectedGroup = _service.GetGroup(id);

if (selectedGroup == null)

return RedirectToAction("Index", "Group");
// Normal Request

if (!Request.IsAjaxRequest())

{

var model = new IndexModel

{

Groups = _service.ListGroups(),

SelectedGroup = selectedGroup

};

return View("Index", model);

}
// Ajax Request

return PartialView("ContactList", selectedGroup);

}

L’action Index() mise à jour retourne 2 choses possibles en fonction du contexte de l’appelant. Si l’action Index() est appelée depuis une requête Ajax alors le contrôleur retourne la vue partielle. Sinon, l’action Index() retourne la vue entière.

Notez que l’action Index() n’a pas besoin de renvoyer beaucoup de données lorsqu’elle est appelée depuis une requête Ajax. Dans le cas d’une requête normale, l’action Index retourne la liste de l’ensemble des groupes de contacts ainsi que le groupe sélectionné. Dans le cas d’une requête Ajax, l’action Index ne retourne uniquement que le groupe sélectionné. Ajax implique ainsi moins de charge sur votre serveur de base de données.

Par ailleurs, notre nouvelle vue fonctionne avec les 2 types de navigateurs. Si vous cliquez sur un groupe de contacts et que vous navigateur supporte JavaScript alors uniquement la région qui contient la liste des contacts sera mise à jour. Si vous navigateur ne supporte pas JavaScript, la vue entière sera bien retournée.

Malgré tout, notre nouvelle vue Index a un petit problème. Lorsque vous cliquez sur un groupe de contacts, le groupe sélectionné n’est pas surligné. Comme la liste des groupes est affichée en dehors de la région qui est mise à jour par la requête Ajax, le bon groupe n’est pas correctement surligné. Nous allons fixer ce problème dans la section suivante.

Ajout des effets d’animation jQuery


Normalement, lorsque vous cliquez sur un lien vers une page web, vous pouvez vérifier que le navigateur télécharge des données à travers la barre de progression. Cependant, lorsque vous effectuez une requête Ajax, la barre de progression du navigateur n’est pas du tout utilisée. Les utilisateurs peuvent ainsi se demander ce qu’il se passe. Comment en effet savoir si le navigateur est figé ou non ?

Il a plusieurs façons d’indiquer à l’utilisateur qu’une opération est en cours pendant l’exécution d’une requête Ajax. Une des approches consiste à afficher une petite animation. Par exemple, vous pouvez faire disparaître avec un effet de fondu une région lorsqu’une requête Ajax commence et la faire réapparaitre lorsque la requête est terminée.

Nous allons utiliser la librairie jQuery qui est incluse dans le framework Microsoft ASP.NET MVC afin de créer les effets d’animation. La vue Index mise à jour se trouve dans le Listing 4.

Listing 4 – Views\Contact\Index.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import Namespace="Helpers" %>



Index








    <% foreach (var item in Model.Groups) { %>

  • >

    <%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList", OnBegin = "beginContactList", OnSuccess = "successContactList", OnFailure = "failureContactList" })%>



  • <% } %>





<% Html.RenderPartial("ContactList", Model.SelectedGroup); %>


 




Notez que la nouvelle vue Index contient 3 nouvelles fonctions JavaScript. Les 2 premières fonctions utilisent jQuery pour faire disparaître puis apparaître la liste des contacts lorsque vous cliquez sur un nouveau groupe de contacts. La 3ème fonction affiche un message d’erreur lorsqu’une requête Ajax part elle-même en erreur (par exemple lors d’une erreur réseau).

La 1ère fonction s’occupe également de surligner le groupe sélectionné. Un attribut de classe ‘selected’ est ajouté à l’élément parent (l’élément LI) de l’élément cliqué. A nouveau, jQuery rend aisé la sélection du bon élément et l’ajout de la classe CSS.

Ces scripts sont liés au groupe de liens à l’aide du paramètre AjaxOptions de la méthode Ajax.ActionLink(). La méthode Ajax.ActionLink() mise à jour ressemble alors à cela :

<%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList", OnBegin = "beginContactList", OnSuccess = "successContactList", OnFailure = "failureContactList" })%>

Ajout du support de l’historique du navigateur


Normalement, lorsque vous cliquez sur un lien pour mettre à jour votre page, l’historique du navigateur est mis à jour. Ainsi, vous pouvez cliquez sur le bouton « Précédent » pour revenir en arrière sur l’état précédent de la page. Par exemple, lorsque vous cliquez sur le groupe de contacts « Amis » et que vous cliquez ensuite sur le groupe « Travail », vous pouvez utiliser le bouton « Précédent » du navigateur pour revenir en arrière à nouveau sur le groupe « Amis ».

Malheureusement, l’exécution d’une requête Ajax ne mets pas à jour l’historique du navigateur automatiquement. Si vous cliquez sur un groupe de contacts et que le groupe associé est retourné grâce à une requête Ajax alors l’historique n’est pas mis à jour. Vous ne pouvez ainsi pas utiliser le bouton « Précédent » pour revenir sur un groupe de contacts précédemment sélectionné.

Si vous souhaitez permettre aux utilisateurs de naviguer dans l’historique après l’exécution de requêtes Ajax, vous devez mettre en place un petit peu de code. Vous devez en effet vous servir du gestionnaire d’historique du navigateur inclus dans le framework ASP.NET AJAX.

Pour mettre en place le support de l’historique ASP.NET AJAX, vous devez faire 3 choses :

  1. Activer la propriété enableBrowserHistory à vrai.

  2. Sauvegarder les points d’historique lorsque l’état d’une vue change en appelant la méthode addHistoryPoint().

  3. Reconstruire l’état de la vue lorsque l’évènement de navigation est levé.

La vue Index mise à jour est présentée dans le Listing 5.

Listing 5 – Views\Contact\Index.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import Namespace="Helpers" %>



Index








    <% foreach (var item in Model.Groups) { %>

  • >

    <%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList", OnBegin = "beginContactList", OnSuccess = "successContactList", OnFailure = "failureContactList" }, new { groupid = item.Id })%>



  • <% } %>





<% Html.RenderPartial("ContactList", Model.SelectedGroup); %>


 




Dans le Listing 5, le support de l’historique est activé dans la fonction pageInit(). Cette fonction est également utilisée pour mettre en place le gestionnaire d’évènement associé à l’évènement de navigation. L’évènement de navigation est levé dès que les boutons « Précédent » ou « Suivant » sont pressés pour changer l’état de la page.

La méthode beginContactList() est appelée lorsque vous cliquez sur un groupe de contacts. Cette méthode créée un nouveau point de sauvegarde de l’historique en appelant la méthode addHistoryPoint(). L’identifiant du groupe de contacts cliqué est alors ajouté dans l’historique.

L’identifiant du groupe est retrouvé à partir d’un attribut étendu positionné sur le lien du groupe de contacts. Le lien est ainsi généré avec l’appel suivant à la méthode Ajax.ActionLink() :

<%= Ajax.ActionLink(item.Name, "Index", new { id = item.Id }, new AjaxOptions { UpdateTargetId = "divContactList", OnBegin = "beginContactList", OnSuccess = "successContactList", OnFailure = "failureContactList" }, new {groupid=item.Id})%>

Le dernier paramètre passé à la méthode Ajax.ActionLink() ajoute le nouvel attribut appelé groupeid au lien (en minuscule pour une compatibilité XHTML).

Lorsqu’un utilisateur clique sur « Précédent » ou « Suivant », l’évènement de navigation est levé et la méthode navigate() est appelée. Cette méthode met à jour les contacts affichés dans la page de manière à faire correspondre l’état de la page au point de sauvegarde de l’historique qui lui est passé en paramètre.

Effectuer des suppressions avec Ajax


Actuellement, pour supprimer un contact, vous devez cliquer sur le lien de suppression puis cliquez sur le bouton « Delete » affiché dans la page de confirmation (Figure 2). Cela implique pas mal d’aller/retours serveurs pour faire quelque chose d’aussi simple que de supprimer un enregistrement de la base de données.

the delete confirmation page

Figure 02: La page de confirmation de suppression

Il est donc tentant de vouloir éviter la page de confirmation et de supprimer un contact directement depuis la vue Index. Vous devriez cependant éviter cette tentation car cette approche amène potentiellement vers des trous de sécurité de votre application. En général, vous ne souhaitez pas qu’une opération de type HTTP GET modifie l’état de votre application Web. Lorsque vous effectuez une suppression, vous souhaitez plutôt effectuer un HTTP POST ou mieux encore une opération de type HTTP DELETE.

Le lien de suppression est présent dans la vue partielle ContactList. Une version mise à jour de la vue partielle est présentée dans le Listing 6.

Listing 6 – Views\Contact\ContactList.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%@ Import Namespace="Helpers" %>























<% foreach (var item in Model.Contacts)

{ %>















<% } %>





Edit



Delete



Name



Phone



Email



'>edit



<%= Ajax.ImageActionLink("../../Content/Delete.png", "Delete", "Delete", new { id = item.Id }, new AjaxOptions { Confirm = "Delete contact?", HttpMethod = "Delete", UpdateTargetId = "divContactList" })%>



<%= Html.Encode(item.FirstName) %>

<%= Html.Encode(item.LastName) %>



<%= Html.Encode(item.Phone) %>



<%= Html.Encode(item.Email) %>



Le lien de suppression est généré avec l’appel suivant à la méthode Ajax.ImageActionLink() :

<%= Ajax.ImageActionLink("../../Content/Delete.png", "Delete", "Delete", new { id = item.Id }, new AjaxOptions { Confirm = "Delete contact?", HttpMethod = "Delete", UpdateTargetId = "divContactList" })%>

La méthode Ajax.ImageActionLink() n’est pas incluse en standard dans le framework ASP.NET MVC. Cette méthode est un helper inclus dans le projet Contact Manager.

Pour disposer du helper, ajoutez une nouvelle classe sous le répertoire « Helpers » et nommez la : ImageActionLinkHelper.cs . Voici le code associé :

Listing 7 – Helpers\ImageActionLinkHelper.cs (ImageActionLink)

using System.Web.Mvc;

using System.Web.Mvc.Ajax;
namespace Helpers

{

public static class ImageActionLinkHelper

{
public static string ImageActionLink(this AjaxHelper helper, string imageUrl, string altText, string actionName, object routeValues, AjaxOptions ajaxOptions)

{

var builder = new TagBuilder("img");

builder.MergeAttribute("src", imageUrl);

builder.MergeAttribute("alt", altText);

var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions);

return link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing));

}
}

}

Le paramètre AjaxOptions dispose lui-même de 2 paramètres. Tout d’abord, la propriété Confirm est utilisée pour afficher une boîte de dialogue de confirmation JavaScript. Ensuite, la propriété HttpMethod est utilisée pour effectuer l’opération HTTP DELETE.

Le Listing 7 contient la nouvelle action AjaxDelete qui a été ajoutée au contrôleur Contact.

Listing 8 – Controllers\ContactController.cs (AjaxDelete)

[AcceptVerbs(HttpVerbs.Delete)]

[ActionName("Delete")]

public ActionResult AjaxDelete(int id)

{

// Get contact and group

var contactToDelete = _service.GetContact(id);

var selectedGroup = _service.GetGroup(contactToDelete.Group.Id);
// Delete from database

_service.DeleteContact(contactToDelete);
// Return Contact List

return PartialView("ContactList", selectedGroup);

}

L’action AjaxDelete() est décorée avec un attribut AcceptVerbs. Cet attribut évite que l’action soit invoquée par toute autre opération qu’un HTTP DELETE. En particulier, vous ne pourrez pas invoquer cette action à travers un HTTP GET.

Après qu’un enregistrement soit supprimé, vous devez afficher la liste mise à jour des contacts ne contenant plus l’élément supprimé. La méthode AjaxDelete() retourne ainsi la vue partielle ContactList et la liste mise à jour des contacts.

En résumé


Dans cette étape, nous avons ajouté des fonctionnalités Ajax à notre application de gestion de contacts. Nous avons utilisé Ajax pour améliorer les temps de réponse et la performance globale de notre application.

Tout d’abord, nous avons revue la vue Index pour que la sélection d’un groupe de contacts ne mette pas à jour la vue entière. A la place, la sélection d’un groupe de contacts se contente de mettre à jour la liste des contacts associés.

Ensuite, nous avons utilisé des effets d’animations jQuery pour faire apparaître ou disparaître la liste des contacts sous forme de fondus. L’ajout d’animations à une application Ajax peut être faire pour fournir à l’utilisateur l’équivalent d’une barre de progression.

Nous avons également ajouté le support de l’historique du navigateur à notre application. Malgré l’utilisation d’Ajax, nous avons permis aux utilisateurs d’utiliser les boutons de navigation « Précédent » et « Suivant » pour avoir un résultat tel qu’attendu habituellement.

Pour terminer, nous avons créé un lien de suppression qui utilise les opérations de type HTTP DELETE. En effectuant des suppressions avec Ajax, nous permettons aux utilisateurs de supprimer des enregistrements sans avoir besoin de passer par une page de confirmation supplémentaire générant un aller/retour inutile vers le serveur.

Ressources complémentaires


similaire:

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconDéveloppement d’une application de gestion de contacts avec asp. Net mvc (C#)
«Mock Object Framework» puis fabriquer des tests unitaires pour nos contrôleurs et logiques de validation

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconArchitecte Analyste Programmeur. Net 5, 0 C#, asp. Net, vb. Net java/J2EE

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconJava 2ee (Jsp Servlet Ejb jpa/Hibernate Spring Jsf “Seam : notions”...

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconA. introduction à asp. Net

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconLa nouvelle application devolo Home Control est maintenant disponible...
«responsive design» et bénéficie d’une architecture complètement revisitée. De cette façon, les utilisateurs ios et Android ont une...

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconLa nouvelle application devolo Home Control est maintenant disponible...
«responsive design» et bénéficie d’une architecture complètement revisitée. De cette façon, les utilisateurs ios et Android ont une...

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconI déploiement d’application Windows avec Visual Studio. Net
...

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconApplication Web «gsb-appliFrais mvc»

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconA gence net design
«Internet apporte un ‘plus’ à toutes les entreprises et le secteur de l’industrie représente un important potentiel de développement...

Développement d’une application de gestion de contacts avec asp. Net mvc (C#) iconIngénieur Etudes & Développement Senior Dot Net / Architecte technique Dot Net








Tous droits réservés. Copyright © 2016
contacts
ar.21-bal.com