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

时间:2016-07-13 17:01:58

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

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

{
  "rules": {
        ".read": "root.child('allowedUids').child(auth.uid).exists()",
        ".write": false,
      }
}

我想要这个:

  

/列表/

返回视图。

和此:

  

/list/random_username.12334

返回另一个视图。

我在 ListController.cs

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

但只有没有参数的索引才有效。另一个返回404.

2 个答案:

答案 0 :(得分:1)

查看您的路线定义。

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

所以理想的网址将是 list/index/somethinglist或' list / index'。但是如果你尝试list/index(索引是用户名的地方),mvc如何知道你的意思是动作方法名而不是param值?

如果您真的想支持list/someusername,可以考虑在操作方法上添加属性路由。

[Route("list/{username}")]
public ActionResult Index(string username)
{
  // to do : return something
}

现在您可以访问yoursite/list/someusername

答案 1 :(得分:0)

很老的问题,但对于那些偶然发现这个问题的人来说,如果您不想为每个方法添加一个属性,一个简单的解决方案是添加另一个路由作为故障转移,如下所示:

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" });
});

以上内容进入 Configure(IApplicationBuilder app, IWebHostEnvironment env) 中的 Startup.cs 方法。

UseEndpointsMicrosoft.AspNetCore.Builder 命名空间中的扩展方法。

在故障转移路由定义中,用户名可能不需要是可选的,并且可能会导致更快的路由处理,我会在您的特定场景中测试它并找到最适合您的方法。

注意:我测试的解决方案是运行 .NET 5,我意识到这个问题主要是针对 .NET Core 1 提出的,但是考虑到这个问题的年龄及其在 Google 中的突出地位,这可能会帮助其他人寻找使用更现代的方法的解决方案。