Question

Je voudrais avoir des URL qui sont encore plus courtes que / {Controller} / {action} / {id}.

Par exemple, je voudrais {contrôleur} / {Id}, où {Id} est une chaîne.

Cela permettrait à des chemins simples, par exemple Utilisateurs / Nom d'utilisateur, Pages / Pagename, Nouvelles / Newsname. J'aime mieux que d'exiger l'action / Détails dans l'URL (Users / Détails / Nom d'utilisateur), ce qui est moins élégante pour l'utilisateur final.

Je peux facilement faire ce travail en mettant en place des itinéraires personnalisés pour tout contrôleur que je veux que ce niveau de simplicité pour. Cependant, cela provoque des maux de tête quand il s'agit de mettre en œuvre d'autres actions, telles que {Controller} / {action}, où {action} = « Créer », puisque, dans ce cas, la chaîne {action} conflits avec la chaîne {Id}.

Ma question: comment puis-je « réservé » des mots, de sorte que si l'URL est / Nouvelles / Créer, elle est traitée comme une action, mais si l'URL est toute autre chose, par exemple / Nouvelles / A-gorille mangé-ma-thèse, il est traité comme un identifiant.

J'espère que je peux définir quand la mise en place mes routes?

Mise à jour:

En utilisant la réponse de Ben Griswold, je l'ai mis à jour les routes par défaut ASP.NET MVC être:

    routes.MapRoute(
    "CreateRoute",                                            // route name
    "{controller}/Create",                                    // url with parameters
    new { action = "Create" }                                 // parameter defaults
);

routes.MapRoute(
    "DetailsRoute",                                           // route name
    "{controller}/{id}",                                      // url with parameters
    new { action = "Details" }                                // parameter defaults
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Cela fonctionne un charme et des moyens, par défaut, les détails des pages utilise l'URL simplifiée, mais je vais encore être en mesure de cibler une action spécifique si je veux (mise à jour / supprimer / détails).

Bien sûr, vous aurez besoin de désavouer l'réservé « Créer » mot comme un identifiant, sinon un utilisateur peut essayer de créer un article, par exemple, avec le nom « Créer », qui ne peut jamais être consulté.

Ceci est vraiment sympa. Si quelqu'un voit qu'il ya quelque chose de mal avec cette approche, carillon, mais je l'aime jusqu'à présent.

Était-ce utile?

La solution

Je pense que vous êtes de gauche avec la création d'un itinéraire pour chaque mot réservé. Par exemple,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );

gérerait / Nouvelles / Créer, / Utilisateurs / Créer, etc. Tant que cette voie est répertorié avant votre autre itinéraire personnalisé, je pense que vous êtes couvert.

Je suppose que vous aurez besoin d'itinéraires pour diverses opérations addition CRUD qui suivent un schéma similaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top