0

В настоящее время я немного знаком с Microsoft MVC4, и я не совсем понимаю маршрутизацию, а также хотел бы.MVC4 URL-адрес переписывания псевдонимов для «более красивых URL-адресов»

То, что я пытаюсь сделать, - сделать мои URL-адреса более удобными для чтения. В настоящее время у меня есть URL-адреса, которые выглядят следующим образом:

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

Все контроллеров пользователя начинается с «пользователем» Мне было интересно, если это было возможно, чтобы изменить эти URL-адрес, так как они выглядят следующим образом:

  • foo.com/ U/Профиль/Детали/6
  • foo.com/u/Experience/Details/
  • foo.com/u/SpecificController/Edit/8

Моя первая попытка была с 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> 

Это работало достаточно хорошо, за исключением Я хотел бы получить/у/на все мои ссылки, везде ...

Например: foo.com/Home/WhatWeDo/

выйдет как: foo.com/u/Home/WhatWeDo/

Это будет тогда 404.

Я использую конфигурацию маршрутизации по умолчанию

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

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

И все мои ссылки рисуются с помощью @ Html.ActionLink (...)

Если кто-то может пролить свет на это, это было бы весьма полезно.

ответ

0

Удалите пользовательские IIS переписать правила и вставить это до вашего умолчанию маршрута

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 } 
); 

Edit: Области

С зонами группировать связанные контроллеры

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

Experience controller 
/User/Experience/Details 

Тогда только один заказ правило эту регистрационную зону этого региона, чтобы заменить «u» на ваших маршрутах

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

Это кажется немного элегантным, я должен был бы сделать это для каждого из моих контроллеров? Есть ли способ добавить мой собственный код/​​модуль, который будет переписывать URL-адреса, как я хочу? – William

+0

Возможно, вам нужны области в вашем проекте. Затем вы измените имена классов контроллеров и не будете беспокоиться о пользовательской маршрутизации/перезаписи. – Jasen

Смежные вопросы