Осмысленная маршрутизация URL-адресов в ASP.NET CORE

Я пытаюсь найти лучший способ сгенерировать названия продуктов в URL-адресе. Поэтому вместо того, чтобы представлять продукты по их идентификатору, я хотел бы, чтобы они были названы.

Например: https: // localhost: 44233 / Товары / Подробности / Яблоки

вместо того

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

Пока что я изменил свой шаблон маршрутизации в моем файле StartUp.cs со значения по умолчанию на тот, который я опубликовал ниже. Не получилось.

Любые предложения о том, как это исправить, помогут!

StartUp.cs

app.UseMvc(routes =>
{
routes.MapRoute(
    name: "Products",
    template: "{controller=Products}/{action=Detail}/{name}"
);
});

Model

public class ProduceDetailVM
{
  public int Id {get; set;}
  public string ProduceName {get;set;}
  public string ProducePrice {get;set;}
  public string ProduceDescription {get;set;}
}

Products Controller

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);
}

RepoService

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);
}

Detail View

<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>

Вы по-прежнему используете параметр Id в Detail(), что приведет к ошибке, если вы больше не будете передавать Id по маршруту. Если вы хотите просмотреть подробную информацию о продукте, используя только имя, вы должны получить все сведения о продукте через name, и каждый продукт должен иметь уникальный name.

Dan Wilson 10.09.2018 20:45

Спасибо за это, Дэн. К сожалению, название товара не уникальное. Есть ли другие способы, с которыми я не знаком?

Chris H. 10.09.2018 21:11

Другого подхода к этому нет. Если вы хотите получить доступ к продуктам с использованием идентификатора (Id или name), этот идентификатор должен быть уникальным. Либо придерживайтесь Id, либо обновите свои данные, чтобы name был уникальным.

Dan Wilson 10.09.2018 21:24

Имеет смысл. Есть ли способ включить как идентификатор, так и имя? то есть localhost: 43222 / Продукты / Подробности / 2 / Apple Как бы это сделать? Атрибут маршрута? или отображение маршрута в startup.cs?

Chris H. 10.09.2018 23:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
51
1

Ответы 1

So far, I've changed my routing template in my StartUp.cs

И, таким образом, полностью игнорирует то, что это похоже на устаревшую технологию в течение многих лет.

Маршрутизация атрибутов позволяет вам определять собственные маршруты для каждого действия на каждом контроллере. Для этого особенно оптимизировано ядро ​​dotnet (с новым механизмом маршрутизации в версии 2.2, которая выходит в этом году).

Спасибо, что обратили на это мое внимание. Как бы это выглядело? Будет ли это работать: [Маршрут ("Продукты / Деталь / имя")] или [Маршрут ("Продукты / Деталь / {имя}")]

Chris H. 10.09.2018 21:21

Второй. Не уверен, что это хорошая идея - специальные символы в URL-адресах проблематичны, локализация может быть большой проблемой. Я обычно избегаю того подхода, который вы хотите использовать. О, и читайте в своем IRepository - антипаттерне.

TomTom 10.09.2018 21:24

Спасибо, Том. Я посмотрю на irepo anipattern. Второй атрибут маршрута у меня не работал. ; (

Chris H. 10.09.2018 23:24

Другие вопросы по теме