2009-10-16 82 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