ASP.NET Core 2 MVC - PullRequest
       43

ASP.NET Core 2 MVC

0 голосов
/ 10 ноября 2019

Я использую asp-route-id для передачи значения идентификатора в контроллер, который вернет мне представление с информацией о «блоге» с таким же id. Все работает, но мне не нравится, как выглядит "Url"!

Как я могу изменить "Url" следующим образом https://localhost:5001/Blog/Blog/8 на этот https://localhost:5001/Blog/Blog/title_of_blog?

Подробности:

  1. есть список блогов блог / список

    HTML-код для каждого из них:

    @model Blog <div class="col-12 col-md-6 col-lg-6" style="padding-top: 30px"> <div class="card card-shadow my-4 card_blog"> <img src="~/img/originals/img-09.jpg" class="card-img-top" alt="..."> <div class="card-body"> <h5 class="card-title">@Model.Title</h5> <p class="card-subtitle">@Model.Date.ToString("dd-MM-yyyy")</p> <p class="card-text">@Model.Description</p> <a asp-route-id="@Model.BlogID" asp-controller="Blog" asp-action="Blog" class="a_s_btn myBTN">Read More</a> </div> </div> </div>

  2. Я нажимаю на тэг <a asp-route-id="@Model.BlogID" asp-controller="Blog" asp-action="Blog" class="a_s_btn myBTN">Read More</a>

  3. здесь действие "Блог" в котроллере "Блог"

    public IActionResult Blog(int id) { var blogModel = new BlogsListViewModel(); blogModel.Blogs = repository.Blogs.OrderBy(p => p.BlogID).Where(p => p.BlogID == id); return View(blogModel); }

  4. Действие "Блог" возвращает мне страницу с информацией о блоге с "BlogID" = 8 Страница блога с собственной информацией

1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете думать об этой проблеме в трех частях:

1. Настройте свой веб-сайт для обработки новой маршрутизации

В файле startup.cs вы найдете раздел метода Configure, который похож на:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        };

Добавить новый тип маршрутак этому (но сохраните существующий маршрут, если вы все еще хотите использовать его для других мест сайта.):

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "byBlogTitle",
                template: "{controller=Home}/{action=Index}/{blogTitle}");
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        };

2. Сгенерируйте URL

При размещении ссылки на странице используйте разметку, например:

<a asp-route-blogTitle="@Model.BlogTitle" asp-controller="Blog" asp-action="Blog"
   class="a_s_btn myBTN">Read More</a>

3. Убедитесь, что контроллер получит и обработает новый маршрут

Вместо вашего текущего метода контроллера, который ожидает параметр id, вам нужно взять строку blogTitle:

public IActionResult Blog(string blogTitle)
{
   var blogModel = new BlogsListViewModel();
   blogModel.Blogs = repository.Blogs.OrderBy(p => p.BlogID).Where(p => p.BlogTitle == blogTitle);
   return View(blogModel);
}

OfКонечно, детали того, как вы получаете по названию, могут меняться в зависимости от вашей переменной. Важным моментом здесь является то, что имя параметра совпадает с новой частью маршрута, предоставленной на шаге 1.

Не забудьте

Имейте в виду, что теперь вы будетенеобходимо обрабатывать специальные символы в вашем URL. URL-адреса не могут содержать некоторые символы, которые ваши пользователи могут добавить в заголовок своего блога, например символы амперсанда или символы не ascii. ( Допустимые символы в URL )

...