定义应用程序的路由

时间:2013-03-08 09:17:43

标签: c# asp.net-mvc asp.net-mvc-routing

您好我正在尝试为我的网址定义路由路径。到目前为止它是这样的:

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而不需要修改操作?

1 个答案:

答案 0 :(得分:2)

如果您未在请求中传递类别ID,您打算从哪里获取?那是不可能的。类别ID应保留为URL的一部分,但您可以在路径中包含友好的类别名称参数。但是不要指望id会自动地来自某个地方。

就像StackOverflow为问题做的那样。查看您的浏览器地址栏。你应该看到这样的东西:

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

注意问题ID和用户友好的问题标题。此标题纯粹用于显示目的,完全被忽略。如果需要,可以用任意字符串替换它。重要的部分是唯一标识实体的内容(即id)。

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