您好,我正在尝试为我的 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 而无需修改操作?
最佳答案
如果您不在请求中传递类别 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
关于c# - 为应用程序定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290490/