【问题标题】:Meaningful URL routing in ASP.NET COREASP.NET CORE 中有意义的 URL 路由
【发布时间】:2018-09-10 18:28:33
【问题描述】:

我正在尝试找出一种更好的方法来在 URL 中生成产品名称。因此,我想要产品的名称,而不是由他们的 ID 表示的产品。

例如: https://localhost:44233/Products/Detail/Apples

而不是

https://localhost:44233/Products/Detail/2

到目前为止,我已将 StartUp.cs 文件中的路由模板从默认更改为我在下面发布的模板。它还没有成功。

任何有关如何解决此问题的建议都会有所帮助!

StartUp.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();
   }
}

IRepository

 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>

【问题讨论】:

  • 您仍在使用Detail() 中的Id 参数,如果您不再通过路由传入Id,则该参数将失败。如果您想仅使用名称查看产品详细信息,则应通过name 检索所有产品详细信息,并且每个产品都应具有唯一的name
  • 谢谢你的丹。不幸的是,产品名称不是唯一的。还有其他我不熟悉的方法吗?
  • 没有其他方法可以解决这个问题。如果您想使用标识符(Idname)访问产品,则该标识符必须是唯一的。要么坚持使用Id,要么更新您的数据,使name 是唯一的。
  • 有道理。有没有办法将 Id 作为标识符和名称都包含在内?即localhost:43222/Products/Detail/2/Apple 该怎么做呢?路由属性?还是 startup.cs 中的路由映射?

标签: c# mysql url-routing asp.net-core-2.1


【解决方案1】:

到目前为止,我已经在 StartUp.cs 中更改了路由模板

因此完全忽略了这就像多年来的遗留技术。

属性路由允许您在每个控制器上的每个操作上定义自定义路由。尤其是 dotnet core 正在为此进行优化(使用今年推出的 2.2 中的新路由引擎)。

【讨论】:

  • 感谢您提请我注意。那会是什么样子?这是否可行:[Route("Products/Detail/name")] 或 [Route("Products/Detail/{name}")]
  • 第二。但不确定这是一个好主意——特殊字符在 URL 中是有问题的,本地化可能是一个巨大的问题。我通常会避免你想采取的方法。哦,阅读您的 IRepository - 反模式。
  • 谢谢汤姆。我将研究 irepo anipattern。第二个路由属性对我不起作用。 ;(
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2017-04-13
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多