获取索引以接受来自路由的可选参数

本文关键字:路由 参数 索引 获取 | 更新日期: 2023-09-27 17:56:44

我的Startup.cs文件中有这个:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "list",
                template: "{controller=List}/{action=Index}/{username?}");
        });

我想要这个:

/列表/

以返回视图。

而这个:

/

list/random_username.12334

以返回另一个视图。

我的ListController中有这个.cs:

    public IActionResult Index(string username)
    {
        if (String.IsNullOrEmpty(username))
        {
            ViewData["Message"] = "user index";
        } else {
            ViewData["Message"] = "Hello " + username;
        }
        return View();
    }

但只有没有参数的索引才能工作。另一个返回 404。

获取索引以接受来自路由的可选参数

查看您的路由定义。

template: "{controller=List}/{action=Index}/{username?}"

所以一个理想的网址将是 list/index/somethinglist或"列表/索引"。但是,如果您尝试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中的突出地位,这可能有助于其他人寻找使用更现代的方法的解决方案。