我正在尝试找出一种更好的方法来在url中生成产品名称。因此,我不想用产品的id来表示产品,而是想知道产品的名称。
例如:https://localhost:44233/产品/细节/苹果
而不是
https://localhost:44233/产品/细节/2
到目前为止,我已经将startup.cs文件中的路由模板从默认更改为我在下面发布的模板。它还没有成功。
任何关于如何解决这个问题的建议都会有帮助!
启动.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Products",
template: "{controller=Products}/{action=Detail}/{name}"
);
});
模型
public class ProduceDetailVM
{
public int Id {get; set;}
public string ProduceName {get;set;}
public string ProducePrice {get;set;}
public string ProduceDescription {get;set;}
}
产品控制器
public async Task<IActionResult> Detail(int Id, string name)
{
var produceDetail = repoService.GetById(Id);
var produceName = repoService.GetByProduceName(name);
var produceModel = new ProduceDetailVM()
{
Id = produceDetail.Id,
ProduceName = produceName.Name,
ProducePrice = produceDetail.Price,
ProduceDescription = produceDetail.Description
};
return View(produceModel);
}
回购服务
public class RepoService: IRepository
{
public ProductsTable GetById(int Id)
{
return _context.ProductsTable.Where(i => i.Id == Id).First();
}
public ProductsTable GetByProduceName(string name)
{
return _context.ProductsTable.Where(p => p.ProduceName == name).FirstOrDefault();
}
}
间接的
public interface IRepository
{
ProductsTable GetById(int Id);
ProductsTable GetByProduceName(string name);
}
局部视图
<html>
<head>
<title>Detail Page</title>
</head>
<body>
<div class="container-fluid">
<span class="image card" style="background-image:url(produceDetail.ProductImage)"></span>
<div class="center">
<a class="button" asp-controller="Products" action="Detail" asp-route-id="@produceDetail.ProduceName">View More</a>
</div>
</div>
</body>
</html>
1条答案
按热度按时间cnh2zyt31#
到目前为止,我已经在startup.cs中更改了路由模板
因此完全忽略了这就像是多年来遗留的技术。
属性路由允许您在每个控制器上的每个操作上定义自定义路由。尤其是dotnetcore正在为此进行优化(今年推出了2.2版的新路由引擎)。