【问题标题】:MVC Core: Wrong link url without trailing slashMVC Core:没有斜杠的错误链接 url
【发布时间】:2019-02-10 09:22:53
【问题描述】:

我开发了一个部署在 iis 下的 mvc core 2.1 web-app。 但是我的路由引擎有问题。 一切正常,当我用这个网址调用网站时:

https://hostname/subfolder1/subfolder2/

但是当我调用没有斜杠 (https://hostname/subfolder1/subfolder2) 的网站时,我在主页上的链接不起作用,因为它们指向了错误的 url。 正确的网址是:https://hostname/subfolder1/subfolder2/link1?param=HelloWorld

如果我在没有尾部斜杠的情况下调用主页,链接如下所示: https://hostname/subfolder1/link1?param=HelloWorld

所以缺少一个子文件夹。

我的路线是:

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

这是我观点的相关代码:

<a class="app-tile" href="@app.Url" title="@app.Description" >

@app.Url 看起来像“./link1?param=HelloWorld”

那么我必须做些什么才能使两个网址都可以使用(带有和不带有斜杠)?

也许将所有不带斜线的请求重定向到带斜线的 url?但是最好的做法是什么?

【问题讨论】:

标签: asp.net-mvc asp.net-core


【解决方案1】:

您可以将 routeOptions 配置为 AppendTrailingSlash 或将其删除。看下面的例子

services.Configure<RouteOptions>(options => options.AppendTrailingSlash = true);

【讨论】:

  • 这不能删除尾部斜杠
  • 不确定我是否正确使用它,但在我的测试系统上,如果我像上面那样使用pattern: "/MYAPP/{controller=Home}/{action=Index}/{id?}"services.Configure&lt;RouteOptions&gt;,则不起作用。
【解决方案2】:

问题在于您使用的是相对 URL,并且根据基本 URL 末尾是否存在斜杠,它们的处理方式将有所不同。

  1. 如果末尾有一个斜线,则基本 URL 被解释为一个目录,因此具有指向 link1 之类的链接的链接将被解释为位于该目录下方。 p>

  2. 1234563即有一个斜杠的路径部分。

这与您的应用无关,具体而言,它是所有浏览器处理相对 URL 的方式。解决方法是对链接、图像、脚本等使用相对绝对 URL。基本上,这意味着您从文档根级别引用所有内容,并带有前面的斜杠。所以,而不是类似的东西:

<a href="link1">Link 1</a>

改用:

<a href="/subfolder1/subfolder2/link1">

通过这种方式,您消除了关于如何连接基本 URL 和链接 URL 路径的歧义,并且它始终是一个好的 URL,无论是否存在尾部斜杠。

就 ASP.NET Core 而言,如果您使用内置的 URL 生成功能,它将为您处理诸如虚拟路径之类的附加内容,例如链接的开头。例如,如果您的网站托管在您的域下的虚拟目录/subfolder1 中,那么当您执行以下操作时:

<a asp-action="Link1Action" asp-controller="Subfolder2">Link 1</a>

那么生成的 href 属性将是正确的/subfolder1/subfolder2/link1

您也可以使用Url.Content,它将映射到您网站的文档根目录:

<a href="@Url.Content("~/subfolder2/link1")">Link 1</a>

然后,假设您的根是 http://hostname/subfolder1,它将再次创建您需要的正确 URL。在 Razor 视图中,您还可以将其简写为:

<a href="~/subfolder2/link1`>Link 1</a>

~/ 构造在 URL 中不受支持,但 Razor 将其理解为对文档根目录的引用,并会在呈现响应视图时解析并替换正确的 URL。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2020-08-03
    • 2012-02-01
    • 2016-01-18
    相关资源
    最近更新 更多