我正在处理 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
),该怎么办?如果缺席)?
最佳答案
以下内容涵盖了您的第一个问题,但略有变化:
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/