【问题标题】:ASP.NET routing with optional URL segments带有可选 URL 段的 ASP.NET 路由
【发布时间】:2010-12-07 10:24:06
【问题描述】:

我正在处理一个 ASP.NET MVC 任务列表,我想在过滤列表时使用 URL 路由。我有一个这样定义的操作方法:

public ActionResult List(int categoryID, bool showCompleted, TaskFilter filter);

enum TaskFilter { MyTasks, MyDepartmentTasks, AllTasks }

我希望我的网址如下所示:

/Tasks/Category4/MyTasks/ShowCompleted/
/Tasks/Category4/MyDepartment
/Tasks/Category4/

Category# 段将始终存在。我希望MyTasks|MyDepartment|AllTasks 段是可选的,如果不存在则默认为AllTasks。我还希望 ShowCompleted 是可选的,默认为 false。

这种路由是否可行,还是我必须退回并只使用查询字符串参数?

后续/额外得分问题:如果我还希望操作方法的第四个参数按任务到期日期过滤,看起来像 Today|Day2Through10(如果不存在,则默认为 Today)?

【问题讨论】:

    标签: asp.net asp.net-mvc routing asp.net-mvc-routing


    【解决方案1】:

    以下内容涉及您的第一个问题,稍作改动:

    routes.MapRoute(
        "t1",
        "Tasks/Category{categoryID}",
        new
        {
            controller = "Task",
            action = "List",
            showCompleted = false,
            strFilter = TaskFilter.AllTasks.ToString()
        }
        );
    
    routes.MapRoute(
        "t2",
        "Tasks/Category{categoryID}/{strFilter}/",
        new
        {
            controller = "Task",
            action = "List",
            showCompleted = false
        }
    );
    
    routes.MapRoute(
        "t3",
        "Tasks/Category{categoryID}/{strFilter}/ShowCompleted",
        new { controller = "Task", action = "List", showCompleted = true }
        );
    

    您需要更改 List 方法以如下方式启动:

    public ActionResult List(int categoryID, bool showCompleted, string strFilter)
    {
        TaskFilter filter = (TaskFilter)Enum.Parse(typeof(TaskFilter), strFilter);
    

    对于您的第二个查询,您只需要使用 {Day2} 等传递给 ActionResult。你应该可以从我给你的东西中弄清楚。

    【讨论】:

    • 谢谢。出于好奇,我需要做些什么才能将 TaskFilter 作为 Enum 而不是字符串传递给 action 方法?我必须扩展/覆盖路由基础架构的哪一部分?
    • @Brant Bobby:这是一个有趣的问题。可以通过为您的 TaskController 实现 IController 而不是 Controller 来实现。您将在其中实现 Execute 方法以首先将字符串更改为 TaskFilter 类型,然后使用它来调用您的 List 方法。
    • @Brant Bobby:我还注意到你仍然可以从 Controller 继承并覆盖 Execute 方法。还有一些其他有趣的方法可能是可能的。
    【解决方案2】:

    查看MvcContrib 库。下面是一个添加带约束的路由的流畅接口示例:http://www.codinginstinct.com/2008/09/url-routing-available-in-mvccontrib.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-07
      • 2017-08-30
      • 2015-12-26
      • 2012-05-10
      • 2019-07-24
      • 2011-04-08
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多