Классификация маршрутов на основе имени параметра URL в Asp. net Core - PullRequest
1 голос
/ 07 апреля 2020

У меня есть 2 страницы, к которым можно получить доступ с помощью этих действий:

public class SearchEngineController : Controller
{
    [Route("/search/{k}")]
    public IActionResult Search(string k = "")
    {
        return View();
    }
}

public class ChannelController : Controller
{
    [Route("{name}")]
    public IActionResult Index(string name = "")
    {
        return View();
    }
}

Теперь, когда я что-то ищу с помощью ключа (somekey), я хочу перенаправить на URL localhost:5000/search?k=somekey

Поскольку мы работаем с каналами (например, с каналами Youtube), поэтому нам необходимо классифицировать названия каналов, они должны быть уникальными. Например, канал с именем mobifone может быть доступен через localhost:5000/mobifone.

Все может выглядеть нормально, пока параметр name (внутри действия Index) не сможет классифицировать при вызове поискового запроса , Итак, каждый раз, когда я набираю localhost:5000/search?k=somekey, он срабатывает на действие Index.

Итак, мое временное решение выглядит так:

public class ChannelController : Controller
{
    [Route("{name}")]
    public IActionResult Index(string name = "")
    {
        if (name.ToLower() == "search")
        {
            // ~/Views/Shared/Search.cshtml
            return View("Search");
        }

        return View();
    }
}

Это может решить проблему, но .... мне это не нравится Потому что я не хочу вкладывать и оправдывать поисковый запрос внутри ChannelController. Это не часть канала. Канал может содержать:

- Id
- Name
- DisplayName
- FounderId
- ...

В промежуточном программном обеспечении _channelManager не должно иметь поискового члена, который может вернуть все в мире , например:

- Channel information
- List of channels
- User profile
- A post content
- List of posts
- ...

Есть ли способ лучше моего?

1 Ответ

2 голосов
/ 07 апреля 2020

Проблема в том, что вы на самом деле не используете правильный маршрут. Вы определили маршрут поиска как "/ search / {k}", что означает, что вам нужно что-то вроде /search/somekey, чтобы действительно попасть в него. Вы запрашиваете /search?k=somekey, который не соответствует поисковому маршруту, и, скорее всего, просто возвращается к вашему маршруту по умолчанию, который так и происходит в этом действии ChannelController.Index. Если вы хотите передать параметр k через строку запроса, вы должны удалить его из определения маршрута, т.е. [Route("/search")].

...