获取索引以接受来自路由的可选参数
Getting Index to accept optional parameters from route
我的 Startup.cs 文件中有这个:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "list",
template: "{controller=List}/{action=Index}/{username?}");
});
我想要这个:
/list/
到return一个视图。
还有这个:
/list/random_username.12334
到return另一个视图。
我的 ListController.cs:
public IActionResult Index(string username)
{
if (String.IsNullOrEmpty(username))
{
ViewData["Message"] = "user index";
} else {
ViewData["Message"] = "Hello " + username;
}
return View();
}
但只有不带参数的索引有效。另一个 returns 404.
看看你的路由定义。
template: "{controller=List}/{action=Index}/{username?}"
所以理想的 url 将是
list/index/something
或 list
或 'list/index'。但是如果你尝试 list/index
(你的索引是用户名),mvc 怎么知道你指的是操作方法名称而不是参数值?
如果你真的想支持list/someusername
,你可以考虑在你的操作方法上添加一个属性路由。
[Route("list/{username}")]
public ActionResult Index(string username)
{
// to do : return something
}
现在您可以访问yoursite/list/someusername
非常老的问题,但是对于那些被这个问题绊倒的人,如果您不想向每个方法添加属性,一个简单的解决方案是添加另一个路由作为故障转移,如下所示:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "page",
pattern: "{controller}/{action}/{username?}",
defaults: new { controller = "List", action = "Index" });
endpoints.MapControllerRoute(
name: "page",
pattern: "{controller}/{username?}",
defaults: new { controller = "List", action = "Index" });
});
以上进入Startup.cs
中的Configure(IApplicationBuilder app, IWebHostEnvironment env)
方法。
UseEndpoints
是在 Microsoft.AspNetCore.Builder
命名空间中找到的扩展方法。
在故障转移路由定义中,用户名可能不需要是可选的并且可能会导致更快的路由处理,我会在您的特定场景中对其进行测试并找到最适合您的方法。
注意:我测试的解决方案是 运行 .NET 5,我意识到这个问题主要是针对 .NET Core 1 提出的,但是考虑到问题的年代及其在 Google,这可能会帮助其他人使用更现代的方法寻找解决方案。
我的 Startup.cs 文件中有这个:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "list",
template: "{controller=List}/{action=Index}/{username?}");
});
我想要这个:
/list/
到return一个视图。
还有这个:
/list/random_username.12334
到return另一个视图。
我的 ListController.cs:
public IActionResult Index(string username)
{
if (String.IsNullOrEmpty(username))
{
ViewData["Message"] = "user index";
} else {
ViewData["Message"] = "Hello " + username;
}
return View();
}
但只有不带参数的索引有效。另一个 returns 404.
看看你的路由定义。
template: "{controller=List}/{action=Index}/{username?}"
所以理想的 url 将是
list/index/something
或 list
或 'list/index'。但是如果你尝试 list/index
(你的索引是用户名),mvc 怎么知道你指的是操作方法名称而不是参数值?
如果你真的想支持list/someusername
,你可以考虑在你的操作方法上添加一个属性路由。
[Route("list/{username}")]
public ActionResult Index(string username)
{
// to do : return something
}
现在您可以访问yoursite/list/someusername
非常老的问题,但是对于那些被这个问题绊倒的人,如果您不想向每个方法添加属性,一个简单的解决方案是添加另一个路由作为故障转移,如下所示:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "page",
pattern: "{controller}/{action}/{username?}",
defaults: new { controller = "List", action = "Index" });
endpoints.MapControllerRoute(
name: "page",
pattern: "{controller}/{username?}",
defaults: new { controller = "List", action = "Index" });
});
以上进入Startup.cs
中的Configure(IApplicationBuilder app, IWebHostEnvironment env)
方法。
UseEndpoints
是在 Microsoft.AspNetCore.Builder
命名空间中找到的扩展方法。
在故障转移路由定义中,用户名可能不需要是可选的并且可能会导致更快的路由处理,我会在您的特定场景中对其进行测试并找到最适合您的方法。
注意:我测试的解决方案是 运行 .NET 5,我意识到这个问题主要是针对 .NET Core 1 提出的,但是考虑到问题的年代及其在 Google,这可能会帮助其他人使用更现代的方法寻找解决方案。