URL-адрес MVC4 переписывает псевдоним для более красивых URL-адресов

В настоящее время я немного новичок в Microsoft MVC4, и я не совсем понимаю маршрутизацию так, как хотелось бы.

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

  • foo.com/UserProfile/Подробности/6
  • foo.com/UserExperience/Подробности/
  • foo.com/UserSpecificController/Edit/8

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

  • foo.com/u/Профиль/Детали/6
  • foo.com/u/Опыт/Детали/
  • 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>

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

Например: 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(...)

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


person William    schedule 09.02.2013    source источник


Ответы (1)


Удалите свои пользовательские правила перезаписи 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 }
);

Редактировать: Области

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

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

Experience controller
/User/Experience/Details

Затем всего одно пользовательское правило для RegisterArea этой области, чтобы заменить «u» в ваших маршрутах.

context.MapRoute(
    "UsersRoute",
    "u/{controller}/{action}/{id}",
    new { Controller = "Home", action = "Index", id = UrlParameter.Optional },
    new string[] { "MyNamespace.MyProj.Areas.User.Controllers" }
);
person Jasen    schedule 09.02.2013
comment
Это кажется немного элегантным, мне придется делать это для каждого из моих контроллеров? Есть ли способ добавить мой собственный код/модуль, который бы переписал URL-адреса так, как я хочу? - person William; 09.02.2013
comment
Возможно, вам нужны Области в вашем проекте. Затем вы измените имена классов контроллера и не будете беспокоиться о пользовательской маршрутизации/перезаписи. - person Jasen; 10.02.2013