【问题标题】:ASP.NET Core 2 MVCASP.NET Core 2 MVC
【发布时间】:2020-03-06 14:49:13
【问题描述】:

我正在使用 asp-route-id 将 id 值传递给控制器​​,控制器将返回一个视图,其中包含与 id 相同的“博客”信息。 一切正常,但我不喜欢“网址”的外观!

如何将https://localhost:5001/Blog/Blog/8 之类的“Url”更改为https://localhost:5001/Blog/Blog/title_of_blog

详情:

  1. 有一个博客列表blog/list

    他们每个人的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. 我正在点击标签&lt;a asp-route-id="@Model.BlogID" asp-controller="Blog" asp-action="Blog" class="a_s_btn myBTN"&gt;Read More&lt;/a&gt;

  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. “博客”操作返回给我一个页面,其中包含有关“博客 ID”= 8 的博客的信息 blog page with own information

【问题讨论】:

  • 你的模型中的title_of_blog 是什么?asp-route-id 会生成像https://localhost:5001/Blog/2 https://localhost:5001/Blog?id=2 这样的url,你可以参考here。你是怎么得到这样的url https://localhost:5001/Blog/?id=2?我建议你可以分享更多细节。
  • 我在问题中添加了详细信息

标签: url asp.net-core routes maproute


【解决方案1】:

你可以把这个问题分成三个部分来思考:

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。生成网址

将链接放入页面时,请使用如下标记:

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

3.确保控制器将接收并处理新路由

您需要使用一个 blogTitle 字符串,而不是需要一个 id 参数的当前控制器方法:

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

当然,根据您的变量,您如何按标题检索的详细信息可能会发生变化。这里的重要一点是参数名称与步骤 1 中提供的路由的新部分匹配。

别忘了

请记住,您现在需要处理 url 中的特殊字符。网址不能包含用户可以添加到其博客标题中的某些字符,例如 & 符号或非 ascii 字符。 (Characters allowed in a URL)

【讨论】:

  • 我试过这个方法(&lt;a asp-route-blogTitle="@Model.BlogTitle" asp-controller="Blog" asp-action="Blog" class="a_s_btn myBTN"&gt;Read More&lt;/a&gt;),但是如果博客标题匹配另一个博客标题怎么办?
  • 是的,这可能是个问题。您可以阻止用户保存具有重复标题的博客,或者在保存副本时附加一些内容。对于类似的事情,这就是我采取的方法:我保存标题和 UrlTitle。在 UrlTitle 中,我保存删除了非 url 字符的标题,如果有重复,可以附加一个数字。这个问题就是为什么使用Id作为链接更可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多