您好我正在尝试为我的网址定义路由路径。到目前为止它是这样的:
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而不需要修改操作?
答案 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