2011-01-31 9 views
0

サイト上にウィザードのようなワークフローを作成しようとしていますが、それぞれのステップのモデルがあります。ASP.Net MVC:パラメータ値によるルートのマップ

私は、次のアクションメソッドがあります:

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

として

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

をそして、私は、ユーザーがアドレスを確認したいすべてのモデルクラスは、ステッププロパティを持つBaseModelから継承します。 パラメータを持つアクションメソッドに正しいAcceptVerbs制約があります。

すべてのメソッドの名前を作成しようとしましたが、その結果AmbiguousMatchExceptionが発生しました。

私が今やりたいことは、それぞれのアクションのカスタムルートを作成することですが、その方法を理解できません。 これは私が試したものです:

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

しかし、これは動作しません。

(正しいMapRoute呼び出しで、あるいは別の方法で)ヘルプがあれば、大歓迎です。

ありがとうございました

答えて

0

私は実際に別のアプローチを発見しました。

新しいルートマップを追加する代わりに、新しいアクションメソッド属性を作成して、渡されたリクエストがそれぞれのアクションメソッドに対して有効かどうかを確認しました。

この

は、属性クラスです:

[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) 

が、私はより多くの、このアプローチが好きメソッドごとに1つのルートを作成します。

関連する問題