8

より「自然」に感じられるようにルーティングテーブルを指定したいと思います

/製品
/製品/17
/製品/編集/17
/製品/作成

デフォルトの構成に近いですが、「インデックス」アクションはコントローラー名の倍数形式にマップされ、「詳細」アクションはコントローラー名の直後のアイテムのIDに直接マップされます。

次のような特別なルーティングマッピングを明示的に定義することで、これを実現できることを私は知っています。

routes.MapRoute(
    "ProductsList",
    "Products",
    new { controller = "Product", action = "Index" }
);
routes.MapRoute(
    "ProductDetails",
    "Product/{id}",
    new { controller = "Product", action = "Details" }
);

/*
 * Ditto for all other controllers
 */

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

上記のコードは私の好みにはあまりにも冗長であり、このURLパターンを広く適用するには、各コントローラーについて少なくとも2回言及する必要があるという欠点があります。

これを一般化する方法はありますか、それともこの場合は肉体労働に縛られていますか?

4

1 に答える 1

2

次のようなことを試すことができます:

routes.MapRoute(
                "ProductsList",
                "{pluralizedControllerName}",
                new { controller = "Home", action = "Index" },
                new { pluralizedControllerName = new PluralConstraint() }
                );

            routes.MapRoute(
                "ProductDetails",
                "{controller}/{id}",
                new { controller = "Home", action = "Details" },
                new { id = @"\d+" }
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

2 番目のルートの制約に注意してください。2/Product/Create番目のルートによって選択されないようにして、3 番目のルートとしてマップされるようにします。

ルート テストにはroutedebuggerを使用できます。ルートの単体テストの記述にはMvcContrib-TestHelperを試してください。NuGet で両方を取得できます。

編集:

この単純なプルーラライザーを使用して、次のようなものを実装できます。

public class PluralConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            List<string> names = GetControllerNames();//get all controller names from executing assembly
            names.ForEach(n => n.Pluralize(n));
            return names.Contains(values[parameterName]);
        }
    }
于 2011-02-16T14:59:35.370 に答える