C# Mvc路由。如何在.net core 3.0中设置默认参数?

C# Mvc路由。如何在.net core 3.0中设置默认参数?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我的控制器是 public partial class GridController : Controller { [Route("/grid/{name}")] public IActionResult Index(string name) { } } 路由设置正确,因为如果我访问/grid/something我会得到http ok 但是如何在startup.cs中设置默认参数 我尝试了以下方法,但是在页面加载时,我得到了HTTP404错误

我的控制器是

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

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

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

我尝试了以下方法,但是在页面加载时,我得到了HTTP404错误

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

在控制器级别使用属性路由,这样它将适用于该控制器下的所有操作方法。

在控制器级别使用属性路由,这样它将适用于该控制器下的所有操作方法。

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


因此,在路线模板中使用
{name?}

name
参数不是可选的


所以,使用
{name?}

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

endpoints.MapControllerRoute(
    "default",
    "{controller=Grid}/{action=Index}");
并通过添加额外的操作重载

public IActionResult Index()
{
    return Index("something");
}
它只是工作

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

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

endpoints.MapControllerRoute(
    "default",
    "{controller=Grid}/{action=Index}");
并通过添加额外的操作重载

public IActionResult Index()
{
    return Index("something");
}
它只是工作

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

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

下面是另一个可能使用参数的解决方法。我用.NETCore2.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
从生产中省略新操作。请参阅。

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

下面是另一个可能使用参数的解决方法。我用.NETCore2.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
从生产中省略新操作。请参阅。

我已设置了“可选参数”和“名称”,但问题仍然存在。我已经看到MapControllerRoute有一个重载“object defaults”,但是我没有找到任何额外的信息来删除索引操作上的Route属性。应该行。实际上我不是在找这样的东西。我希望具有Route属性。谢谢你的努力,没关系。但在页面加载时,应用程序将尝试查找/Grid/Index。您当前的装饰将映射到/Grid/name。这显然是有区别的。除非我不明白你想要什么。你的评论很好。谢谢它启动了一个解决方案,即设置了“可选参数”和“名称”,但问题仍然存在。我已经看到MapControllerRoute有一个重载“object defaults”,但是我没有找到任何额外的信息来删除索引操作上的Route属性。应该行。实际上我不是在找这样的东西。我希望具有Route属性。谢谢你的努力,没关系。但在页面加载时,应用程序将尝试查找/Grid/Index。您当前的装饰将映射到/Grid/name。这显然是有区别的。除非我不明白你想要什么。你的评论很好。谢谢它启动了一个变通方法,我尝试为参数指定一个参数,例如,
../{name=something}
,但我仍然被路由到无参数操作。我几乎可以肯定这过去是可行的,但最终使用了您的变通方法。事实证明,它确实可行,但只有当操作只有一个重载且没有
RouteAttribute
时。我尝试为参数指定一个参数,例如
../{name=something}
,但我仍然被路由到无参数操作。我几乎可以肯定这曾经是有效的,但最终使用了您的变通方法。事实证明,它确实有效,但仅当操作只有一个重载且没有
RouteAttribute
时。