【问题标题】:Mvc routing. How can i set a default parameter in .net core 3.0?mvc路由。如何在 .net core 3.0 中设置默认参数?
【发布时间】:2021-03-31 19:01:30
【问题描述】:

我的控制器是

public partial class GridController : Controller
{
      [Route("/grid/{name}")]
      public IActionResult Index(string name)
      {

      }
}

路由设置正确,因为如果我访问 /grid/something 我得到 http ok。

但是如何在 startup.cs 中设置默认参数?

我尝试了以下方法,但在页面加载时,我收到 http 404 错误

endpoints.MapControllerRoute(
                   "default",
                   "{controller=Grid}/{action=Index}/{name}");

【问题讨论】:

  • 我尝试为参数指定一个参数,例如.../{name=something},但我仍然被路由到无参数操作。我几乎可以肯定这曾经有效,但最终使用了您的解决方法。
  • 事实证明它确实有效,但前提是该操作只有一个重载且没有RouteAttribute

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


【解决方案1】:

好的。最终找到了解决方法

endpoints.MapControllerRoute(
    "default",
    "{controller=Grid}/{action=Index}");

并通过添加额外的动作重载。

public IActionResult Index()
{
    return Index("something");
}

简单有效

[Route("/grid/{name}")]
public IActionResult Index(string name )
{
}

【讨论】:

    【解决方案2】:

    在Controller级别使用属性路由,使其适用于该控制器下的所有动作方法。

    【讨论】:

      【解决方案3】:

      在您的路线模板中。 name 参数不是可选的。

      所以,请使用{name?}

      【讨论】:

      • 我已经设置了“可选参数”和“名称?”但问题仍然存在。我已经看到 MapControllerRoute 有一个重载“对象默认值”,但我还没有找到任何其他信息
      • 尝试删除索引操作上的路由属性。应该工作。
      • 其实我不是在寻找这样的东西。我希望有 Route 属性。感谢您的努力。
      • 没关系。但是在页面加载时,您的应用程序将尝试查找 /Grid/Index。您当前的装饰将映射到 /Grid/name。显然有区别。除非我不明白你想要什么。
      • 您的评论很棒。谢谢!它启动了一个解决方法
      【解决方案4】:

      首先,您没有在端点配置中指定name 参数。所以应该是{controller=Grid}/{action=Index}/{name=something}。但是,如果有重载,这似乎无论如何都不起作用。我想知道这是一个错误还是有意设计的。似乎如果同一动作有多个重载,则执行将定向到无参数的。

      这是另一个可以使用参数的解决方法。我用 .NET Core 2.2 试过这个。创建一个具有相同参数但没有RouteAttribute 的新操作。从那里您可以重定向到必要的操作。这是我使用TestIndex 作为默认路由的示例。

      [Route("/[controller]/{name}/{age}")]
      public IActionResult Index(string name, int age)
      {
          // implementation
          return Ok($"{name} is {age} years old.");
      }
      
      public IActionResult Index()
      {
          return Index("Mr. It", 7);
      }
      
      public IActionResult TestIndex(string name, int age)
      {
          return RedirectToAction(nameof(Index), new { name, age });
      }
      

      然后对于默认路由使用新方法,例如{controller=Grid}/{action=TestIndex}/{name=That}/{age=42}.

      如果您将其用于测试,则可以通过添加TypeFilterAttribute 从生产中省略新操作。见this answer for more details

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        相关资源
        最近更新 更多