定义应用程序的路由
本文关键字:路由 应用程序 定义 | 更新日期: 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