2011-01-31 69 views
0

我試圖在網站上創建類似嚮導的工作流程,並且我爲每個步驟都有一個模型。ASP.Net MVC:根據參數值映射路由

我有以下操作方法:

public ActionResult Create(); 
public ActionResult Create01(Model01 m); 
public ActionResult Create02(Model02 m); 
public ActionResult Create03(Model03 m); 

而且我希望用戶看到地址

/Element/Create 
/Element/Create?Step=1 
/Element/Create?Step=2 
/Element/Create?Step=3 

所有的模型類從具有步驟屬性BaseModel繼承。 具有參數的操作方法具有正確的AcceptVerbs約束。

我嘗試命名所有方法創建,但導致AmbiguousMatchException。

我現在想要做的是爲每個動作創建一個自定義路由,但我無法弄清楚如何去做。 這是我試過的:

 routes.MapRoute(
     "ElementsCreation", 
     "Element/Create", 
     new{controller="Element", action="Create01"}, 
     new{Step="1"} 
     ); 

但是這不起作用。

任何幫助(在正確的MapRoute調用或可能是一種不同的方法)將不勝感激。

謝謝

回答

0

我實際上找到了一種不同的方法。

我創建了一個新的Action Method屬性來驗證傳遞的請求是否對每個操作方法有效,而不是添加新的Route Map。

這是屬性類:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ParameterValueMatchAttribute : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     var value = controllerContext.RequestContext.HttpContext.Request[Name]; 
     return (value == Value); 
    } 

    public string Value { get; set; } 
    public string Name { get; set; } 
} 

而且我有相同名稱的操作方法,每一個裝飾這樣的:

[AcceptVerbs(HttpVerbs.Post)] 
[ParameterValueMatch(Name="Step", Value="1")] 
public ActionResult Create(Model01 model) 

我喜歡這種方法,很多不止爲每種方法創建一條路線。