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
时。