1

私はProAsp.netmvc3フレームワークの本を読んでいます。別のホームページを持てるようにデフォルトルートを変更したい。Pagesという新しいコントローラーとHomeというビューを追加しました。これが私のホームページとして欲しいものです。

これをglobal.asax.csに追加してみました

routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
                new { controller = "Pages", action = "Home", id = "DefautId" });

これによりデフォルトページが変更されますが、カテゴリが台無しになります

  public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(null,
                        "", // Only matches the empty URL (i.e. /)
                        new
                            {
                                controller = "Product",
                                action = "List",
                                category = (string) null,
                                page = 1
                            }
            );

        routes.MapRoute(null,
                        "Page{page}", // Matches /Page2, /Page123, but not /PageXYZ
                        new {controller = "Product", action = "List", category = (string) null},
                        new {page = @"\d+"} // Constraints: page must be numerical
            );

        routes.MapRoute(null,
                        "{category}", // Matches /Football or /AnythingWithNoSlash
                        new {controller = "Product", action = "List", page = 1}
            );

        routes.MapRoute(null,
                        "{category}/Page{page}", // Matches /Football/Page567
                        new {controller = "Product", action = "List"}, // Defaults
                        new {page = @"\d+"} // Constraints: page must be numerical
            );

        routes.MapRoute(null, "{controller}/{action}");
    }

これを機能させるにはどうすればよいですか?

アップデート:

URL: ホームページはアイテムのリストに移動します

http://localhost/SportsStore/ 

クリックしたカテゴリ

http://localhost/SportsStore/Chess?contoller=Product 

ホームページにヒットしたコントローラー

 public class ProductController : Controller
    {
        private readonly IProductRepository repository;
        public int PageSize = 4;

        public ProductController(IProductRepository repoParam)
        {
            repository = repoParam;
        }


        public ViewResult List(string category, int page = 1)
        {
            var viewModel = new ProductsListViewModel
                                {
                                    Products = repository.Products
                                        .Where(p => category == null || p.Category == category)
                                        .OrderBy(p => p.ProductID)
                                        .Skip((page - 1)*PageSize)
                                        .Take(PageSize),
                                    PagingInfo = new PagingInfo
                                                     {
                                                         CurrentPage = page,
                                                         ItemsPerPage = PageSize,
                                                         TotalItems = category == null
                                                                          ? repository.Products.Count()
                                                                          : repository.Products.Where(
                                                                              e => e.Category == category).Count()
                                                     },
                                    CurrentCategory = category
                                };

            return View(viewModel);
        }

ホームページでヒットしたいコントローラー

public class PagesController : Controller
{
    public ViewResult Home()
    {
        return View();
    }

}

ありがとう、

4

3 に答える 3

5

私はそれをこのように動作させることができました:

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

    routes.MapRoute(null, "", new {controller = "Pages", action = "Home"});

    //routes.MapRoute(null,
    //                "", // Only matches the empty URL (i.e. /)
    //                new
    //                    {
    //                        controller = "Product",
    //                        action = "List",
    //                        category = (string)null,
    //                        page = 1
    //                    }
    //    );

    routes.MapRoute(null,
                    "Page{page}", // Matches /Page2, /Page123, but not /PageXYZ
                    new {controller = "Product", action = "List", category = (string) null},
                    new {page = @"\d+"} // Constraints: page must be numerical
        );

    routes.MapRoute(null,
                    "{category}", // Matches /Football or /AnythingWithNoSlash
                    new {controller = "Product", action = "List", page = 1}
        );

    routes.MapRoute(null,
                    "{category}/Page{page}", // Matches /Football/Page567
                    new {controller = "Product", action = "List"}, // Defaults
                    new {page = @"\d+"} // Constraints: page must be numerical
        );


    //routes.MapRoute(null, "{controller}/{action}");

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

    //routes.MapRoute("MyRoute", "{controller}/{action}",
    //    new { controller = "Pages", action = "Home" });

もっと良い方法はありますか?

于 2012-08-10T18:34:17.560 に答える
1

最初のオプションは、次のページルーティング方法を使用することです。

routes.MapRoute("Give route a name btw","Page/{page}", // Matches /Page/2
   new {controller = "Product", action = "List", category = urlParameter.Optional},
   new {page = @"\d+"} 
);

このようにして、ルートはよりRESTの方法になります。

他の方法-正規表現を使用する正規表現を使用してルートを定義する

PS:このリンクが現在オンラインかどうかを確認することはできません。数日前は大丈夫でした。
PS2:そしてファウストはルートの順序について正しいです。貪欲なルートは最後に行きます。
PS3:実装したいURLスキームを書けますか?

于 2012-08-07T21:28:35.803 に答える
0

ルートマッピングの最後にデフォルトルートを配置してください。それが最後の場合、カテゴリルートを台無しにする方法はありません。

このルートの場合の更新:

routes.MapRoute(null, "{controller}/{action}");

デフォルトの前に来ると、3番目のURLパラメーター(id)を持つアイテムを除いて、デフォルトルートがキャッチすると予想されるすべてのものをキャッチします。

したがって、たとえば:

/somepage/home

デフォルトではなく、上記のルートに捕まります。

したがって、おそらくこのルートを削除する必要があります。

于 2012-08-07T21:26:18.137 に答える