IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Générer des url "clean" avec RouteUrl


Sujet :

ASP.NET MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai Avatar de gerardlecloerec
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut Générer des url "clean" avec RouteUrl
    Bonjour à tous,

    Je ne comprend pas bien comment fonctionne les RouteUrl.

    Voici mon code, si jamais il manque des choses, j'éditerai mon post pour l'ajouter directement dedans.

    Ce que je cherche à faire c'est de générer des URLs de cette forme : LocalHost:12345/Mode/Femmes/Robes/Robe-Moulante/
    Le problème c'est que quelque sois la façon dont je génère l'url dans mon fichier de vue en razor l'url sois ressemble à ça LocalHost:12345/ListOrGrid/ListOrGrid/4?UrlFomer=Mode/Femmes/Robes/RobeMoulante/ ou bien le href de mon <a> est juste vide à la génération Oo

    Le contenu de ce que j'envoie pour les ID provient d'une table qui à cette forme :

    id id_Parent Nom_Categorie
    1 Mode
    2 1 Femmes
    3 2 Robes
    4 3 RobeMoulante


    ListOrGridController.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public ActionResult ListOrGrid(short categorieID = 1)
            {
                List<ArticlePrevisualisation> articlePrevisualisation = new List<ArticlePrevisualisation>();
     
                //foreach (var item in collection)
                //{
                //    ArticlePrevisualisation artPrev = new ArticlePrevisualisation();
                //    ARTICLES_DEFINITIONSet aRTICLES_DEFINITIONSet = new ARTICLES_DEFINITIONSet();
                //    aRTICLES_DEFINITIONSet = db.ARTICLES_DEFINITIONSet.Where(w => w.);
                //    ARTICLESSet aRTICLESSet = new ARTICLESSet();
                //    articlePrevisualisation.Add(artPrev);
                //}
     
     
                return View();
            }
    RouteConfig.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     
     
                routes.MapRoute(
                    name: "Index",
                    url: "",
                    defaults: new { controller = "Home", action = "Index" });
     
     
                routes.MapRoute(
                    name: "Categorie",
                    url: "{urlFormer}",
                    defaults: new { controller = "ListOrGrid", action = "ListOrGrid", id = UrlParameter.Optional, urlFormer = UrlParameter.Optional }
                );
     
     
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }
    GlobalFunction.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
        /// <summary>
        /// forme une url propre sans caractère spéciaux ni accent
        /// </summary>
        /// <param name="EntryUrl"></param>
        /// <returns></returns>
        public static string FormatUrl(string EntryUrl)
        {
            string ExitUrl = EntryUrl;
            ExitUrl = ExitUrl.Replace(" ", "");
            ExitUrl = ExitUrl.Replace("-", "");
            ExitUrl = ExitUrl.Replace("%", "");
            ExitUrl = ExitUrl.Replace("/", "");
            ExitUrl = ExitUrl.Replace("&", "");
            ExitUrl = ExitUrl.Replace("'", "");
            ExitUrl = ExitUrl.Replace("__", "");
            ExitUrl = ExitUrl.Replace("_", "");
            ExitUrl = ExitUrl.Replace("é", "e");
            ExitUrl = ExitUrl.Replace("à", "a");
            ExitUrl = ExitUrl.Replace("ù", "u");
            ExitUrl = ExitUrl.Replace("è", "e");
            ExitUrl = ExitUrl.Replace("ä", "a");
            ExitUrl = ExitUrl.Replace("â", "a");
            ExitUrl = ExitUrl.Replace("ê", "e");
            ExitUrl = ExitUrl.Replace("ë", "e");
            ExitUrl = ExitUrl.Replace("ï", "i");
            ExitUrl = ExitUrl.ToLower();
            return ExitUrl;
        }
     
        /// <summary>
        /// Récupère la liste des noms des catégories parentes pour former l'url
        /// </summary>
        /// <param name="categorieID"></param>
        /// <returns>String formaté avec les noms des catégories récupérées</returns>
        public static string nomCategories(short categorieID)
        {
            string url = "";
            try
            {
                List<short> listIdCategorieURL = new List<short>();
                do
                {
                    short catId = new short();
                    catId = db.CATEGORIESSet.Where(w => w.Categorie_Id == categorieID).Select(s => s.Categorie_Id).FirstOrDefault();
                    int i = 0;
                    listIdCategorieURL.Add(catId);
                    categorieID = new short();
                    categorieID = db.CATEGORIE_PARENTSSet.Where(w => w.Categorie_Id == categorieID).Select(s => s.Categorie_ParentId).FirstOrDefault();
                } while (categorieID != 0);
     
     
                listIdCategorieURL.Reverse();
     
     
                foreach (short item in listIdCategorieURL)
                {
                    if(listIdCategorieURL.Last() == item)
                        url += nomCategorie(item);
                    else
                        url += nomCategorie(item) + "/";
                }
     
     
                return url;
            }
            catch(ArgumentNullException ex)
            {
                Debug.WriteLine(ex);
                return "";
            }
            catch(InvalidOperationException ex)
            {
                Debug.WriteLine(ex);
                throw ex;
            }
            catch(NullReferenceException ex)
            {
                Debug.WriteLine(ex);
                return "";
            }
            catch(EntityException ex)
            {
                db.Dispose();
                Debug.WriteLine(ex);
                return "";
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                throw ex;
            }
        }
    _Layout.cshtml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="@Url.RouteUrl("Categorie", new { id = cat.Categorie_Id, urlFormer = GlobalFunction.FormatUrl(GlobalFunction.nomCategories(cat.Categorie_Id)) })" class="level-top"><span>@cat.Categorie_Intitule</span> </a>
    Je pense avoir tout donné !

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    L'élément default de ta route "Categorie" n'est pas cohérent avec ce que tu essaies d'obtenir ; de plus tu ne peux pas avoir un controller et une action qui ont le même nom puisque controller est un nom de classe, action un nom de méthode et la seule méthode ayant le même nom que sa classe est le constructeur. Par ailleurs, tu ne places pas l'id de la catégorie dans ton exemple d'Url.

  3. #3
    Membre à l'essai Avatar de gerardlecloerec
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    L'élément default de ta route "Categorie" n'est pas cohérent avec ce que tu essaies d'obtenir
    Hum Noxen ce n'est pas la route "Default" qu'il faut regarder mais la route nommé "Categorie", c'est par celle là que je souhaite passer.

    [FONT=Verdana, sans-serif]tu ne peux pas avoir un controlleur et une action qui ont le même nom puisque controller est un nom de classe, action un nom de méthode et la seule méthode ayant le même nom que sa classe est le constructeur.[/FONT]
    Il n'y a aucun soucis ici, je le sais très bien que normalement on ne peux pas faire ça mais ici Visual Studio ne semble pas m'en empêcher puisque ça fonctionne, je le changerai si c'est ce qui te dérange ^^

    Par ailleurs, tu ne places pas l'id de la catégorie dans ton exemple d'Url.
    J'utilise =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Url.RouteUrl("Categorie", new { id = cat.Categorie_Id, urlFormer = GlobalFunction.FormatUrl(GlobalFunction.nomCategories(cat.Categorie_Id)) }) // Je passe bien mon id ainsi que la forme de l'url que je souhaite obtenir 
    Url à obtenir -> LocalHost:12345/Mode/Femmes/Robes/Robe-Moulante/

    Ce que je récupère ->
    LocalHost:12345/ListOrGrid/ListOrGrid/4?UrlFomer=Mode/Femmes/Robes/RobeMoulante/ ou Vide
    Controller/ Action /id/paramètre supplémentaire

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Citation Envoyé par gerardlecloerec Voir le message
    Hum Noxen ce n'est pas la route "Default" qu'il faut regarder mais la route nommé "Categorie", c'est par celle là que je souhaite passer.
    Je ne parle pas de la route "Default", mais bien de la propriété defaults de ta route "Categorie" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    routes.MapRoute(
      name: "Categorie",
      url: "{urlFormer}",
      defaults: new { controller = "ListOrGrid", action = "ListOrGrid", id = UrlParameter.Optional, urlFormer = UrlParameter.Optional }
    );
    Citation Envoyé par gerardlecloerec Voir le message
    Url à obtenir -> LocalHost:12345/Mode/Femmes/Robes/Robe-Moulante/
    Dans cette Url, quelle est la partie qui contient l'id de la catégorie ? Moi je ne vois que les noms des catégories et sous-catégories.

  5. #5
    Membre à l'essai Avatar de gerardlecloerec
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Envoyé par gerardlecloerec
    Hum Noxen ce n'est pas la route "Default" qu'il faut regarder mais la route nommé "Categorie", c'est par celle là que je souhaite passer.
    Je ne parle pas de la route "Default", mais bien de la propriété defaults de ta route "Categorie" :
    Explique toi sur ce qui n'est pas cohérent, je ne comprend pas le problème c'est pour ça que j'ai posé ma question à la base ^^

    Envoyé par gerardlecloerec
    Url à obtenir -> LocalHost:12345/Mode/Femmes/Robes/Robe-Moulante/


    Dans cette Url, quelle est la partie qui contient l'id de la catégorie ? Moi je ne vois que les noms des catégories et sous-catégories.
    Justement je ne veux pas que l'id s'affiche dans l'url mais qu'il soit envoyer de façon transparente, comme un POST et non un GET, j'ai dû mal m'exprimer.

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Je me suis un petit peu replongé dans le fonctionnement du routage ASP MVC, ça fait toujours du bien.

    Tout d'abord une question : est-ce-que l'url que tu veux utiliser fonctionne ? Parce-que d'après les quelques informations que j'ai glanées ça ne devrait pas être le cas.

    Ta route "Categorie" risque d'intercepter toutes les url à l'exception de l'url vide et la route "Default" ne sera pas utilisées ; pour pallier à ce problème je te suggère d'utiliser un "préfixe", par exemple "Categories". Par ailleurs le nombre segments (éléments de l'url séparés par des "/") doit correspondre au nombre de paramètres déclarés dans le format de l'url ; pour qu'un paramètre récupère tous les segments restant il faut le préfixer d'un "*". Ce qui donne au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    routes.MapRoute(
      name: "Categorie",
      url: "Categories/{*urlFormer}",
      defaults: new { controller = "Categorie", action = "ListOrGrid", urlFormer = UrlParameter.Optional }
    );
    La méthode ListOrGrid de ton contrôleur Categorie prend en paramètre une string urlFormater :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ActionResult ListOrGrid(string urlFormater)
    Note que sans un attribut [HttpPost] la méthode n'accepte que les requêtes http "GET".

    Ce que tu cherches à faire, à savoir envoyer un id masqué en plus de l'url ne me paraît pas possible ; c'est effectivement ce qu'on fait lors de la soumission d'un formulaire web, mais dans le cas présent il s'agit d'un simple lien <a>, tu dois te débrouiller avec la seule url. Mais avec ce que je te propose tu récupèreras une chaîne complète ("Mode/Femmes/Robes/Robe-Moulante") que tu pourras analyser pour trouver l'item correspondant.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Tu devrais faire plutot une route de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
                routes.MapRoute(
                    name: "Mode",
                    url: "{controller}/{action}/{filter1}/{filter2}"
                 );
    Dans ton controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
            // GET: Mode
            public ActionResult Femmes(string filter1, string filter2, int id)
            {
                return View();
            }
    ne pas oublier de mettre un champ (caché, textbox, ou autre) dans ton form avec le name "Id"

    [EDIT]

    ne pas oublié de mettre la route AVANT la route defaut. Les routes s'ajoutent du plus restrictif/unique au moins restrictif...

    [EDIT]

    A+

  8. #8
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    L'url est fondée sur une hiérarchie d'articles, stockés en base de données, elle est dynamique, il ne peut pas savoir à l'avance combien de segments vont être présents, donc il ne peut pas utiliser le pattern que tu proposes. Les champs de formulaire, cachés ou non, ça marche avec les formulaires, ici il s'agit d'un simple hyperlien.

  9. #9
    Membre à l'essai Avatar de gerardlecloerec
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    @Noxen

    Tout d'abord une question : est-ce-que l'url que tu veux utiliser fonctionne ? Parce-que d'après les quelques informations que j'ai glanées ça ne devrait pas être le cas.
    Oui l'url qui se génère de cette forme : LocalHost:12345/ListOrGrid/ListOrGrid/4?UrlFomer=Mode/Femmes/Robes/RobeMoulante/ me redirige bien là ou je le veux.

    Ta route "Categorie" risque d'intercepter toutes les url à l'exception de l'url vide et la route "Default" ne sera pas utilisées ;
    Oui c'est bien le problème c'est pour ça que j'ai créer la route Index mais ce n'est pas une solution en sois.

    Par ailleurs le nombre segments (éléments de l'url séparés par des "/") doit correspondre au nombre de paramètres déclarés dans le format de l'url ; pour qu'un paramètre récupère tous les segments restant il faut le préfixer d'un "*". Ce qui donne au final :
    Aurait-tu de la documentation sur ce '*' de préfixe ?

    Le nombre de segment dans le format de l'url c'est le nombre de paramètres après le '?' ou bien le nombre de catégories que j'appel par la fonction qui génère l'urlFomer ? Ou bien autres chose que je n'ai pas compris xD

    Ce que tu cherches à faire, à savoir envoyer un id masqué en plus de l'url ne me paraît pas possible ; c'est effectivement ce qu'on fait lors de la soumission d'un formulaire web, mais dans le cas présent il s'agit d'un simple lien <a>, tu dois te débrouiller avec la seule url. Mais avec ce que je te propose tu récupèreras une chaîne complète ("Mode/Femmes/Robes/Robe-Moulante") que tu pourras analyser pour trouver l'item correspondant.
    Mais les items je les récupères déjà puisque je passe mon id (.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new { id = cat.Categorie_Id,
    ....) et ca fonctionne avec l'url ci-dessus mais c'est juste moche à l'affichage et pour les futur client du site que je développe. :/

    @Dokho1000

    Tu devrais faire plutot une route de cette facon :
    Non ce n'est pas du tout ce à quoi j'aspire pour mon url.

    Dans ton controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    // GET: Mode
    public ActionResult Femmes(string filter1, string filter2, int id)
    {
    return View();
    }
    C'est impossible que je fassent ceci c'est des catégories qui sont écrites dans une tables pas des contrôleurs unique qui sont généré à la volé pour chaque categorie ça serait bien trop dure et je ne pense pas cela possible oO (ou peut-être que si ?)

    ne pas oublié de mettre la route AVANT la route defaut. Les routes s'ajoutent du plus restrictif/unique au moins restrictif...
    Ça je le savait, mais merci =D

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Ok, j'avais pas compris qu'il n'y aurait pas de limite aux nombre de parametre, tu dois faire une route alors avec un parametre et une wildcard ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
     
     
                routes.MapRoute("infiniteFilters", "{*cats}", new { controller = "Mode", action = "Femmes" });
     
        public class ModeController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }
            // GET: filters
            public ActionResult Femmes(string categories)
            {
     
                return View();
            }
        }

  11. #11
    Membre à l'essai Avatar de gerardlecloerec
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    routes.MapRoute("infiniteFilters", "{*cats}", new { controller = "Mode", action = "Femmes" }); 
        public class ModeController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }
            // GET: filters
            public ActionResult Femmes(string categories)
            {
     
                return View();
            }     }
    Il n'y a aucun ModeController ni d'action Femmes, ni rien de ce genre, et il n'y en aura jamais.

    C'est une table pas un controller !

  12. #12
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Quand je parle de segments d'url c'est en gros chaque élément séparé par un "/". Pour "Mode/Femmes/Robes/RobeMoulante/" tu aurais les segments Mode, Femmes, Robes et RobesMoulantes. Un segment peut être composé de plusieurs paramètres, séparés par une constante, par exemple : "Mode/Femmes/Robes/RobeMoulante/bleue-courte-hivers", la dernier segment est composé des trois paramètres bleue, courte et hivers.

    La wildcard dans les segments d'url pour la route je l'avais vue dans un bouquin, mais j'ai trouvé un article de la msdn qui mentionne cette possibilité :
    https://msdn.microsoft.com/fr-fr/lib...0de%20segments

    Pour ce qui est du contrôleur et de la méthode action c'est moi qui me suis trompé, j'avais oublié que le nom du contrôleur est suffixé du mot Controller, d'où : ListOrGridController.ListOrGrid(categorieID).

    Concernant l'id, comme tu utilises un hyperlien tu es obligé de l'inclure dans l'url si tu veux l'utiliser. Mais comme je disais, tu peux ne pas te baser sur l'id et à la place utiliser les segments de l'url comme codes pour identifier tes catégories et les récupérer depuis ta base.

    Avec cette route :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    routes.MapRoute(
      name: "Categorie",
      url: "Categories/{*urlFormer}",
      defaults: new { controller = "ListOrGrid", action = "ListOrGrid", urlFormer = UrlParameter.Optional }
    );
    Si tu charges dans ta vue un modèle ayant une propriété urlFormer, tu peux générer une url pour ta route avec quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Url.RouteUrl("Categorie", new { urlFormer = Model.urlFormer})
    Tu peux même directement générer un lien avec un HtmlHelper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.RouteLink(Url.RouteUrl("Categorie", new { urlFormer = Model.urlFormer}) ?? "Lien introuvable", "Categorie", new { urlFormer = Model.urlFormer })

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Quand je parle de segments d'url c'est en gros chaque élément séparé par un "/". Pour "Mode/Femmes/Robes/RobeMoulante/" tu aurais les segments Mode, Femmes, Robes et RobesMoulantes. Un segment peut être composé de plusieurs paramètres, séparés par une constante, par exemple : "Mode/Femmes/Robes/RobeMoulante/bleue-courte-hivers", la dernier segment est composé des trois paramètres bleue, courte et hivers.

    La wildcard dans les segments d'url pour la route je l'avais vue dans un bouquin, mais j'ai trouvé un article de la msdn qui mentionne cette possibilité :
    https://msdn.microsoft.com/fr-fr/lib...0de%20segments

    Pour ce qui est du contrôleur et de la méthode action c'est moi qui me suis trompé, j'avais oublié que le nom du contrôleur est suffixé du mot Controller, d'où : ListOrGridController.ListOrGrid(categorieID).

    Concernant l'id, comme tu utilises un hyperlien tu es obligé de l'inclure dans l'url si tu veux l'utiliser. Mais comme je disais, tu peux ne pas te baser sur l'id et à la place utiliser les segments de l'url comme codes pour identifier tes catégories et les récupérer depuis ta base.

    Avec cette route :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    routes.MapRoute(
      name: "Categorie",
      url: "Categories/{*urlFormer}",
      defaults: new { controller = "ListOrGrid", action = "ListOrGrid", urlFormer = UrlParameter.Optional }
    );
    Si tu charges dans ta vue un modèle ayant une propriété urlFormer, tu peux générer une url pour ta route avec quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Url.RouteUrl("Categorie", new { urlFormer = Model.urlFormer})
    Tu peux même directement générer un lien avec un HtmlHelper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.RouteLink(Url.RouteUrl("Categorie", new { urlFormer = Model.urlFormer}) ?? "Lien introuvable", "Categorie", new { urlFormer = Model.urlFormer })
    Tout ca pour dire exactement la même chose que mon précédent poste...

  14. #14
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    Tout ca pour dire exactement la même chose que mon précédent poste...
    Qui ne dit pas grand chose de plus que ce que j'avais posté 2 ou 3 messages avant. Et que ce pas grand chose consiste essentiellement en des erreurs qui montrent que tu n'as pas lu correctement la question d'origine. Alors je ne crois pas que tu sois bien placé pour donner des leçons...

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Qui ne dit pas grand chose de plus que ce que j'avais posté 2 ou 3 messages avant. Et que ce pas grand chose consiste essentiellement en des erreurs qui montrent que tu n'as pas lu correctement la question d'origine. Alors je ne crois pas que tu sois bien placé pour donner des leçons...
    Je ne donne aucune leçon mais mon poste au moins je ne donne pas des infos inutiles comme mettre le paramètre en optionnel puisque de toute facon il peux y avoir 0 à n paremetre...de plus j'ajoutais le code dans le controller pour montrer la logique.

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    J'ai mis ca arbitrairement, tu peux t'en passer aussi...

Discussions similaires

  1. Construire des URL "propres" avec le titre de l'article mais sans ID
    Par speedev dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 23/06/2008, 18h24
  2. [XSLT] Générer des fichiers XML avec PHP
    Par oneTime dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 28/04/2008, 21h27
  3. générer des furm web avec designer 10g
    Par simocove dans le forum Forms
    Réponses: 0
    Dernier message: 17/09/2007, 12h35
  4. [XSLT] Générer des fichier SQL avec un XSD
    Par NoiBe dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/01/2007, 10h39
  5. [Excel] Générer des fichiers Excel avec PHP et des données SQL
    Par MaTHieU_ dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 29/03/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo