【问题标题】:Getting Index to accept optional parameters from route让索引接受来自路由的可选参数
【发布时间】:2016-07-13 17:01:57
【问题描述】:

我的 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。

【问题讨论】:

  • 您的模式需要/Index
  • @SLaks 你是什么意思?

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


【解决方案1】:

查看您的路线定义。

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

所以一个理想的网址是 list/index/somethinglist 或“列表/索引”。但是如果您尝试list/index(您的索引是用户名),mvc 怎么知道您的意思是操作方法名称而不是参数值?

如果你真的想支持list/someusername,你可以考虑在你的action方法上添加一个属性路由。

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

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

【讨论】:

  • 谢谢,这行得通。但是这样做是不好的做法吗? IE。在索引上使用参数?
  • 我不认为这是一种不好的做法。根据需要使用。
【解决方案2】:

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

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)方法。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多