0

私は現在、Microsoft の MVC4 に少し慣れていないため、ルーティングについて十分に理解していません。

私がやろうとしているのは、URL をより人間が読めるようにすることです。現在、次のような URL があります。

  • foo.com/UserProfile/詳細/6
  • foo.com/UserExperience/詳細/
  • foo.com/UserSpecificController/Edit/8

すべてのユーザーコントローラーには「User」というプレフィックスが付いています。これらの URL を次のように変更できるかどうか疑問に思っていました。

  • foo.com/u/プロフィール/詳細/6
  • foo.com/u/Experience/詳細/
  • 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(...) で描画されます

誰かがこれに光を当てることができれば、それは大歓迎です。

4

1 に答える 1

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

編集:エリア

エリアを使用して、関連するコントローラーをグループ化します

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

Experience controller
/User/Experience/Details

次に、そのエリアの RegisterArea のカスタム ルールを 1 つだけ指定して、ルートの「u」を置き換えます。

context.MapRoute(
    "UsersRoute",
    "u/{controller}/{action}/{id}",
    new { Controller = "Home", action = "Index", id = UrlParameter.Optional },
    new string[] { "MyNamespace.MyProj.Areas.User.Controllers" }
);
于 2013-02-09T01:07:54.037 に答える