0

サイトでウィザードのようなワークフローを作成しようとしていますが、各ステップのモデルがあります。

私は次の行動方法を持っています:

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

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

すべてのメソッドにCreateという名前を付けようとしましたが、その結果、AmbiguousMatchExceptionが発生しました。

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

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

しかし、これは機能しません。

(正しいMapRoute呼び出しまたはおそらく別のアプローチでの)助けをいただければ幸いです。

ありがとう

4

1 に答える 1

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つのルートを作成するよりも、このアプローチが非常に気に入っています。

于 2011-01-31T06:23:50.927 に答える