0

Je suis actuellement un peu nouveau sur Microsoft MVC4 et je ne comprends pas bien le routage comme je le voudrais. Ce que j'essaie de faire est de rendre mes URL plus lisibles par l'homme. À l'heure actuelle, j'ai URL qui ressemblent à ceci:MVC4 URL réécriture aliasing pour "URLs plus jolies"

  • foo.com/UserProfile/Details/6
  • foo.com/UserExperience/Details/
  • foo.com/UserSpecificController/Edit/8

Tous les contrôleurs de l'utilisateur sont PREFIXÉ je « utilisateur » demandais s'il était possible de changer les URL afin qu'ils ressemblent à ceci:

  • foo.com/ u/profil/Détails/6
  • foo.com/u/Experience/Details/
  • foo.com/u/SpecificController/Edit/8

Ma première tentative a été avec IIS:

<rewrite> 
     <rules> 
      <rule name="AddTrailingSlashRule1" stopProcessing="true"> 
       <match url="(.*[^/])$" /> 
       <conditions> 
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
       <action type="Redirect" url="{R:1}/" /> 
      </rule> 
      <rule name="Pretty User Redirect" enabled="false" stopProcessing="true"> 
       <match url="User(.*)/(.*)" /> 
       <action type="Redirect" url="u/{R:1}/{R:2}" /> 
       <conditions> 
       </conditions> 
      </rule> 
      <rule name="User pretty URL Rewrite"> 
       <match url="u/(.*)/(.*)" /> 
       <action type="Rewrite" url="User{R:1}/{R:2}" /> 
      </rule> 
     </rules> 
    </rewrite> 

Cela a fonctionné très bien sauf que je recevrais/u/sur tous mes liens, partout ...

Par exemple: foo.com/Home/WhatWeDo/

sortirait comme: foo.com/u/Home/WhatWeDo/

Ce serait alors 404.

J'utilise la configuration de routage par défaut

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

Et tous mes liens sont dessinés avec @ Html.ActionLink (...)

Si quelqu'un pouvait faire la lumière sur ce sujet, cela serait grandement apprécié.

Répondre

0

Retirez votre commande IIS règles de réécriture et insérez ceci avant votre itinéraire par défaut

routes.MapRoute(
    name: "UserProfile", 
    url: "u/Profile/{action}/{id}", 
    defaults: new { controller = "Home", id = UrlParameter.Optional } 
); 

routes.MapRoute(
    name: "UserExperience", 
    url: "u/Experience/{action}/{id}", 
    defaults: new { controller = "Home", id = UrlParameter.Optional } 
); 

Modifier: les zones

avec les zones que vous contrôleurs liés au groupe

Profile controller within a User area 
/User/Profile/Details 

Experience controller 
/User/Experience/Details 

Ensuite, il suffit d'une règle personnalisée pour RegisterArea de cette zone pour remplacer le «u» dans vos itinéraires

context.MapRoute(
    "UsersRoute", 
    "u/{controller}/{action}/{id}", 
    new { Controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new string[] { "MyNamespace.MyProj.Areas.User.Controllers" } 
); 
+0

Cela semble un peu élégant, je devrais le faire pour chacun de mes contrôleurs? Existe-t-il un moyen d'ajouter mon propre code/module qui réécrirait les URL comme je le souhaite? – William

+0

Peut-être que vous voulez des zones dans votre projet. Ensuite, vous allez changer les noms des classes de contrôleurs et ne pas vous soucier du routage/réécriture personnalisé. – Jasen