具有可选 URL 段的 ASP.NET 路由

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

我正在处理 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|AllTask​​s 段是可选的,如果不存在则默认为 AllTask​​s 。我还希望 ShowCompleted 是可选的,默认为 false。

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

后续/额外学分问题:如果我还想要操作方法上的第四个参数来按任务截止日期进行过滤,看起来像 Today|Day2Through10 (默认 Today),该怎么办?如果缺席)?

最佳答案

以下内容涵盖了您的第一个问题,但略有变化:

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。从我给你的内容中你应该能够弄清楚。

关于具有可选 URL 段的 ASP.NET 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579027/

相关文章:

c# - 插入语句不起作用

asp.net-mvc - ASP MVC 5 图像显示

javascript - 对于 Controller 的 Ajax Post 方法,参数作为空值传入

Symfony2 单 Controller 多路由

c# - 在asp.net MVC中获取第三个参数

c# - 如何动态设置 IFrame 的源?

c# - 如何创建每小时运行一次的线程? APS.NET WebApi

c# - 操作过滤器中的 session 变量

asp.net - 在 ASP.NET MVC 中构建自定义授权

asp.net-mvc - 具有干净 URL 的多个路由参数