.NET 7 属性路由不适用于某些值

问题描述 投票:0回答:1

我正在尝试使用属性路由进行路由。

当我这样定义路由时,它不会重定向到页面。

public class HomeController : Controller
{
   [Route("/blog")]
   public IActionResult BlogsPage()
   {
       return View();
   } 
}

相反,当我更改路线定义时,页面会正确打开。

例如:

public class HomeController : Controller
{
   [Route("/blogs")]
   public IActionResult BlogsPage()
   {
       return View();
   } 
} 

public class HomeController : Controller
{
   [Route("/blog2")]
   public IActionResult BlogsPage()
   {
       return View();
   } 
}

这样,当“blogs”定义为“blog2”时,页面会打开,但不会以“blog”定义打开。

我该如何解决这个问题?

Program.cs

中的路由相关配置
app.UseRouting();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"); 

我尝试通过更改

Program.cs
中的配置来获得不同的结果,但没有成功。

c# routes attributes .net-7.0
1个回答
0
投票

我正在尝试使用属性路由进行路由。当我定义 这样路由,不会重定向到页面。

嗯,根据您的场景和描述,不清楚您是如何尝试到达路线的,这也是关键点。根据您的program.cs配置,您的默认路由已设置为

{controller=Home}/{action=Index}/{id?}
,控制器中也缺少索引,并且根据属性路由定义索引将默认调用。因此,它应该返回 404 错误。

这样,当“blogs”定义为“blog2”时,页面打开了,但是 它不会以“博客”定义打开。

不太明显,为什么你无法到达路线终点。我已经在本地测试中进行了尝试,并且可以从浏览器访问端点,如下所示:

我该如何解决这个问题?

在转向解决方案之前,让我向您解释一些事情,如果您检查 [Route("")] 接口,该接口是从 IRouteTemplateProvider 派生的 RouteAttribute 类型,具有 TemplateName 属性,如下所示:

因此,如果你想从另一个控制器操作重定向到路由,你应该通过路由名称来调用它,而不是代码中缺少的模板名称,并且你已经使用了 [Route("/blog")] 这是模板名称。

解决方案:

Y为了解决您的问题,除了路线模板之外,您还应该使用路线名称。您可以按照以下步骤操作:

        [Route("blog", Name = "blog")]
        public IActionResult BlogsPage()

        {
            return View();
        }

注意: 第一个是路由模板,下一个是路由名称,当从另一个控制器动作调用时,您应该根据您的场景使用路由名称。

最重要的是,从您想要重定向到博客操作的操作,您可以像下面这样操作:

public IActionResult Index()
        {
            return RedirectToRoute("blog");
        }

输出:

此外,如果你想在开始时加载你的博客操作,你应该配置你的默认路由模式。

注意:参阅此官方文档以获取有关属性路由的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.