3

嗨,我正在尝试为我的 URL 定义路由路径。这是目前的样子:

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

这可行,但它不完全是我想要的。目前我的网址看起来像这样:

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

我想要的是能够将 categoryId 替换为实际的类别名称。类别名称不会作为参数传递给操作,只有 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 应保留为 url 的一部分,但您可以在路由中包含友好的类别名称参数。但不要指望 id 会自动来自某个地方。

就像 StackOverflow 为问题做的一样。查看您的浏览器地址栏。您应该看到如下内容:

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

请注意问题 ID 和用户友好的问题标题。这个标题纯粹是为了展示的目的,完全被忽略了。如果需要,您可以将其替换为任意字符串。重要的部分是将唯一标识实体(即 id)的内容。

当然,如果您的类别名称是唯一的,您可以使用类别名称而不是路线中的 id。另外,如果您这样做,请不要忘记在 url 的路径部分中不允许使用一些特殊字符这一事实。Scott Hanselman 写了一篇nice blog post关于这个主题的文章。您将需要过滤掉那些危险的字符,并用所谓的slug替换实际的类别名称。例如,StackOverflow 如何做到这一点:https ://stackoverflow.com/a/25486/29407

于 2013-03-08T09:21:40.363 回答