2009-10-16 80 views
2

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

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如果缺席)任务的截止日期来过滤?

回答

3

接下来我们将介绍你的第一个问题,有轻微的变化:

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

您将需要更改列表的方法来启动这样的:

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

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

+0

谢谢。出于好奇,我必须做什么才能将一个TaskFilter作为一个Enum而不是一个字符串传递给操作方法?哪一部分路由基础设施需要扩展/覆盖? – 2009-10-20 16:01:42

+0

@Brant Bobby:这是一个有趣的问题。通过为你的TaskController实现IController而不是Controller可能是可能的。你会在哪里实现Execute方法,首先将字符串更改为TaskFilter类型,然后用它来调用你的List方法。 – 2009-10-20 16:35:19

+0

@Brant Bobby:我也注意到你仍然可以从Controller继承,并重写Execute方法。在那里还有其他一些有趣的方法可能是有可能的。 – 2009-10-20 16:55:46