定义应用程序的路由

本文关键字:路由 应用程序 定义 | 更新日期: 2023-09-27 18:02:49

嗨,我正在为我的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。类别名称不是作为参数传递给操作的,只有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来实现这一点?

定义应用程序的路由

如果您不在请求中传递类别id,您打算从哪里获取类别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