1

ASP.NET MVC を使用してサイトを構築しています。ではRouteConfig、次のようにメソッドを変更しました。

public static void RegisterRoutes(RouteCollection routes)
{
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     routes.MapRoute(
         name: "Default",
         url: "{Director}/{Movie}/{id}",
         defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional, Director = UrlParameter.Optional, Movie = UrlParameter.Optional }
         );

     routes.MapRoute(
         name: "Default2",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Movies", action = "Create", id = UrlParameter.Optional }
         );            
}

IndexView では、次のようにコーディングしました。

@model IEnumerable<MvcMovie.Models.Director>

<table>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
        </tr>
        <tr>
            <td>
                @foreach (var movie in item.Movies)
                {
                    <div style="width: 100%;">
                        @Html.ActionLink(movie.Title, "Index", new { Director = movie.Director.Name, Movie = movie.Title }, null)
                    </div>
                }
            </td>
        </tr>
    }
</table>

RouteConfigクライアントの要求を満たすために、監督や映画ごとに異なる URL が必要なので、実際に変更しましたSEO requirement

アクションに対しては正常に機能していますが、を使用してアクションをIndex呼び出そうとしても、アクションが呼び出されます。これまでの私の理解によると、アクションを呼び出す必要があります。私は MVC を初めて使用するので、私の質問がばかげていると思われる場合は申し訳ありません。しかし、ここで欠けている主なものは何ですか?Create@Html.ActionLink("Create New", "Create")IndexCreate

4

2 に答える 2

4

Routeconfig はトップダウンでチェックされます。

更新:ルートでコントローラー名を指定する必要があります。そうしないと、routeconfig が質問にあった方法で、Default2 が起動されることはありません。URLをlocalhost/movies/create/id. そのためには、次のようにします。

public static void RegisterRoutes(RouteCollection routes)
{
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     routes.MapRoute(
         name: "MoviesDefault",
         url: "Movies/{action}/{id}",
         defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional }
         );  

     /* not sure about this route without testing - 
     /* i think it would conflict with the above route
     routes.MapRoute(
         name: "MovieDirector",
         url: "Movies/{Director}/{Movie}/{id}",
         defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional, Director = UrlParameter.Optional, Movie = UrlParameter.Optional }
         );
     */

     // for this following route, i've left 'Movies' as the controller, but it should be 
     // your 'home page' controller. As in, whatever your default http://localhost:port/ should be.
     routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional }
     ); 
}
于 2013-06-18T05:52:34.627 に答える
0

このように修正して確認していただけないでしょうか。

URLが

//http://localhost/Movies/Create/1 -> invokes Movies controller and Create action.

 public static void RegisterRoutes(RouteCollection routes)
    {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapRoute(
             name: "MoviesCreate",
             url: "Movies/{Movies}/Create/{id}",
             defaults: new { controller = "Movies", action = "Create", id = UrlParameter.Optional }
             );    
//http://Movies/JCameron/Titanic/12 -> invokes Movies controller and Index action.

         routes.MapRoute(
             name: "MoviesHome",
             url: "Movies/{Director}/{Movie}/{id}",
             defaults: new { controller = "Movies", action = "Index", id = UrlParameter.Optional, Director = UrlParameter.Optional, Movie = UrlParameter.Optional }
             );

}

100% 確信があるわけではありません。修正が必要です。ただし、同様のタイプの URL パターンを渡して 2 つのコントローラーを呼び出すことはできません。

質問のコードによると、URLが一致する場合、常に最初のルートが呼び出されます。また、2 番目のルートにも同じパターンを使用しています。SO 2 番目のルートは常に非表示です。確認してお知らせください。

于 2013-06-18T06:07:15.060 に答える