mvcコントローラのデフォルトベースクラスController
は、呼び出すアクションを選択するのにActionInvokerを使用します。最初に、アクションはが選択され、デフォルトではRouteData ["action"]値からが選択され、選択されたアクションのパラメータに対するすべてのモデルのバインドと検証が行われます。そのため、呼び出し元が同じ名前で同じ属性を持つ2つのアクションを選択すると、2つのアクションを区別できないため、エラーが発生します。
しかし、アクション選択ロジックを管理するための組み込み方法は、ActionMethodSelector classから派生した属性を使用することです。最初に、それから派生したクラスを作成します。このクラスにはアクションを呼び出すためのロジックが含まれています。パラメータがで を渡さGET registrationToken何 がなかった場合は、あなたの場合
では、それ以外の場合は、第二を使用することになり、パラメータなし 登録アクションを使用します。
public class RegistrationActionTokenAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
if (controllerContext.HttpContext.Request.QueryString.AllKeys.Contains("registrationToken"))
{
return true;
}
return false;
}
}
クエリ文字列パラメータ「registrationToken」が含まれている場合、私は、2番目のアクションを選択するために有効とマークする必要があることを実演ロジックを実装しました。残ったものは、この属性を使って2番目のメソッドを飾ることです。
[RegistrationActionToken]
public virtual ActionResult Register (Guid registrationToken) {...}
エラーがなくなりました。さらにコントローラはクエリ文字列パラメータに応じて正しいアクションを選択するようになりました
ええ、それは1つの解決策ですが、私はMVCによって自動化されたソリューションを期待していました。私は、MVCがパラメータによってアクション間を区別できると思っただけです。 – KallDrexx
@KallDrexx - 問題は、 'no parameter'と 'parameter is null'を区別しないことです。同様に 'パラメータ 'a'がセットされ、パラメータ' b'がヌルで、パラメータ名 'a'がセットされ、パラメータ' b'はありません。単純なケースでは明白に思えるかもしれませんが、これは難解なケースでは実装が容易ではありません。これは非常に複雑でバグの多い意思決定の枠組みとなるでしょう。 –
それは意味がある – KallDrexx