C# 升级到asp.net core 2.2后为空href

C# 升级到asp.net core 2.2后为空href,c#,asp.net-core,asp.net-core-2.1,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.1,Asp.net Core 2.2,我们已经建立了一个ASP.NET Core 2.1网站,其中URL喜欢并确定要显示的resx文件和内容。升级到ASP.NET Core 2.2后,页面会加载,但生成的所有链接都会生成空白/空的href 例如,此链接: <a asp-controller="Home" asp-action="Contact">@Res.ContactUs</a> 我缩小了问题的范围,但找不到解决的办法; 基本上在2.2中。上述iroutConstr

我们已经建立了一个ASP.NET Core 2.1网站,其中URL喜欢并确定要显示的
resx
文件和内容。升级到ASP.NET Core 2.2后,页面会加载,但生成的所有链接都会生成空白/空的href

例如,此链接:

<a asp-controller="Home" asp-action="Contact">@Res.ContactUs</a>
我缩小了问题的范围,但找不到解决的办法; 基本上在2.2中。上述
iroutConstraint Match
方法中未设置某些参数,例如:

httpContext = null
route = {Microsoft.AspNetCore.Routing.NullRouter)
在2.1中

 httpContext = {Microsoft.AspNetCore.Http.DefaultHttpContext}
 route = {{lang:lang}/{controller=Home}/{action=Index}/{id?}}
我在2.1和2.2之间所做的唯一区别就是我改变了

var builder = new ConfigurationBuilder()
   .SetBasePath(Directory.GetCurrentDirectory())
   .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
至以下(到期)

有什么想法吗

更新 根据ASP.NET,Core2.2使用EndpointRouting,而2.1使用IRouter基本逻辑。这就解释了我的问题。现在,我的问题是2.2使用新的EndpointRouting的代码是什么样子的?

解释了这里发生的事情(重点是我的):

链接生成环境值无效算法与端点路由一起使用时表现不同

环境值无效是一种算法,用于确定当前执行的请求中的哪些路由值(环境值)可用于链路生成操作。当链接到不同的操作时,常规路由总是使额外的路由值无效。在ASP.NET Core 2.2发布之前,属性路由没有这种行为。在ASP.NET Core的早期版本中,指向使用相同路由参数名称的其他操作的链接会导致链接生成错误。在ASP.NET Core 2.2或更高版本中,当链接到另一个操作时,两种形式的路由都会使值无效

当链接的目标是不同的操作或页面时,不会重用环境值。

在您的示例中,
lang
是一个环境值,因此当从
Home/Index
转到
Home/About
时,它不会被重用(不同的操作)。如果没有为
lang
指定值,则没有匹配操作,因此生成空href。文档中还将其描述为端点路由差异:

但是,如果操作不存在,端点路由将生成空字符串。从概念上讲,如果操作不存在,端点路由不会假定端点存在

如果要继续使用端点路由,似乎需要将
lang
值从控制器传递到视图中,然后显式设置它。下面是一个例子:

public class HomeController : Controller
{
    public IActionResult Index(string lang)
    {
        ViewData["lang"] = lang; // Using ViewData just for demonstration purposes.
        return View();
    }
}
@Res.ContactUs

您可以使用动作过滤器等减少重复性,但概念仍然相同。我看不出有其他方法来处理这个问题(例如,能够将特定值标记为环境值),但也许其他人能够插话进来。

您需要显式地传递路由数据中的值:

// Use the routing logic of ASP.NET Core 2.1 or earlier:
services.AddMvc(options => options.EnableEndpointRouting = false)
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
@using Microsoft.AspNetCore.Routing;
<a ... asp-route-storeId="@this.Context.GetRouteValue("storeId")">Pay Button</a>
@使用Microsoft.AspNetCore.Routing;
付款按钮

您不必这样做,因为路由数据已经具有值
asp route lang=“@this.Context.GetRouteValue(“lang”)”
我感谢您的评论,也为回复太晚表示歉意。无论环境值是多少,总是要传递asp路由,或者用(字符串lang)修饰所有操作,这似乎是一件很繁重的工作。有没有更简单的方法?我现在正在考虑升级到ASP.NET Core 3.1,但必须使用@ViewData或ASP route环境值更新100多个URL,这似乎是错误的设计方法。对于延迟回复,我深表歉意。无论环境值如何,总是要通过asp路由似乎需要做很多工作。有没有更简单的方法?我正在考虑升级到ASP.NET Core 3.1,但必须用scheme更新100多个URL似乎是错误的设计方法。
var builder = new ConfigurationBuilder()
   .SetBasePath(Directory.GetCurrentDirectory())
   .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
 var builder = new ConfigurationBuilder()
    .SetBasePath(hostingEnvironment.ContentRootPath) // using IHostingEnvironment 
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
public class HomeController : Controller
{
    public IActionResult Index(string lang)
    {
        ViewData["lang"] = lang; // Using ViewData just for demonstration purposes.
        return View();
    }
}
// Use the routing logic of ASP.NET Core 2.1 or earlier:
services.AddMvc(options => options.EnableEndpointRouting = false)
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
@using Microsoft.AspNetCore.Routing;
<a ... asp-route-storeId="@this.Context.GetRouteValue("storeId")">Pay Button</a>