3

こんにちは私は自分のURLのルーティングパスを定義しようとしています。これはこれまでのところ次のようになっています。

routes.MapRoute(
            name: "Category",
            url: "{controller}/DisplayBooksByCategory/{categoryId}/{pageNumber}",
            defaults: new { controller = "Home", action = "DisplayBooksByCategory" }
        );

これは機能しますが、正確には私が望むものではありません。現時点では、私のURLは次のようになっています。

http://localhost:51208/Home/DisplayBooksByCategory/7/1

私が欲しいのは、categoryIdを実際のカテゴリ名に置き換えることができるようにすることです。カテゴリ名はパラメータとしてactionに渡されず、categoryIdのみです。これが私のアクションです。

 public ActionResult DisplayBooksByCategory(int pageNumber, int categoryId)
    {
        int bookByCategoryCount = bookRepository.CountBooksByCategory(categoryId);
        var entities = new BooksAndCategories
        {
            Books = bookRepository.GetBookByCategory(categoryId, pageNumber, numberOfBooksOnPage),
            PageNumber = pageNumber,
            LastPageNumber = (bookByCategoryCount / numberOfBooksOnPage) + 1,
            NumberOfBooksPerPage = numberOfBooksOnPage,
            Categories = categoryRepository.GetCategories(),
            CurentPage = "ProductManager",
            CurentCategory = categoryId
        };
        return View("DisplayBooksByCategory", entities);
    }

アクションを変更せずにルーティングAPIを使用してそれを行う方法はありますか?

4

1 に答える 1

2

リクエストでカテゴリIDを渡さない場合、どこからカテゴリIDを取得する予定ですか?それは可能ではありません。カテゴリIDはURLの一部として残す必要がありますが、ルートにわかりやすいカテゴリ名パラメータを含めることができます。ただし、IDが自動的にどこかから来るとは思わないでください。

StackOverflowが質問に対して行うのと同じように。ブラウザのアドレスバーを見てください。次のように表示されます。

https://stackoverflow.com/questions/15290490/defining-routing-for-application

質問IDとユーザーフレンドリーな質問タイトルに注意してください。このタイトルは純粋に表示目的であり、完全に無視されます。必要に応じて、任意の文字列に置き換えることができます。重要な部分は、エンティティ(ID)を一意に識別するものです。

もちろん、カテゴリ名が一意である場合は、ルートのIDの代わりにカテゴリ名を使用できます。また、そのようにする場合は、URLのパス部分で許可されていない特殊文字がいくつかあることを忘れないでください。スコットハンゼルマンはnice blog postこのトピックについて書いています。これらの危険な文字を除外し、実際のカテゴリ名をいわゆるスラッグに置き換える必要があります。たとえば、StackOverflowがそれを行う方法は次のとおりです:https ://stackoverflow.com/a/25486/29407

于 2013-03-08T09:21:40.363 に答える