汎用コントローラーを作成しようとしています。つまり、次のようになります。
public class MyController<T> : Controller where T : SomeType
{ ... }
しかし、それを使おうとすると、どこでもこのエラーが発生します...
コントローラ名は「コントローラ」で終わる必要があります
だから、私の質問、asp.net mvcで汎用コントローラーを作成することは可能ですか?
ありがとう!
汎用コントローラーを作成しようとしています。つまり、次のようになります。
public class MyController<T> : Controller where T : SomeType
{ ... }
しかし、それを使おうとすると、どこでもこのエラーが発生します...
コントローラ名は「コントローラ」で終わる必要があります
だから、私の質問、asp.net mvcで汎用コントローラーを作成することは可能ですか?
ありがとう!
私があなたを正しく理解している場合、あなたがやろうとしていることは、特定のモデルに対するすべての要求をタイプTの汎用コントローラーを介してルーティングすることです。
要求されたモデルに基づいてTを変更する必要があります。
/Product/Index
トリガーしたいMyController<Product>.Index()
これは、独自の方法を記述し、次のようなメソッドIControllerFactory
を実装することで実現できます。CreateController
public IController CreateController(RequestContext requestContext, string controllerName)
{
Type controllerType = Type.GetType("MyController")
.MakeGenericType(Type.GetType(controllerName));
return Activator.CreateInstance(controllerType) as IController;
}
はい、できます。大丈夫です。私はそれらを自分でたくさん使用しました。
確認する必要があるのは、MyControllerから継承する場合でも、タイプ名をコントローラーで終了することです。
public class FooController : MyController<Foo>
{
...
}
デフォルトのコントローラーファクトリは、要求をディスパッチするコントローラーを見つけようとするときに、コントローラー名の周りに「規則」を使用します。必要に応じて、このルックアップ機能をオーバーライドできます。これにより、汎用コントローラーが機能するようになります。
このMSDNの記事...
http://msdn.microsoft.com/en-us/magazine/dd695917.aspx
...何が起こっているのかについての良い記事があります。
これは、実際に正解が含まれているasp.netmvc汎用コントローラーの複製です。ジェフ・フリッツの答えは絶対に正しくありません。独自のIControllerFactoryを作成しても、表示されているエラーを生成しているExpressionHelper.GetRouteValuesFromExpressionの制限を超えることはありません。独自のIControllerFactoryを実装すると、RedirectToAction、BuildUrlFromExpression、ActionLink、RenderAction、BeginForm、これらを呼び出すメソッドを呼び出すたびにエラーが発生します。
私にとって興味深いのは、Microsoftの「慣例による制限」は、ExpressionHelper.GetRouteValuesFromExpressionメソッドの型に設定された制約「whereTController:Controller」によってすでに適用されていることです。ジェネリックは、コンベンションの検証を満たすことはありません。
string controllerName = typeof(TController).Name;
if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) {
throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action");
}
typeof(AnyGeneric).Nameが「Controller」で終わることはないため、「Controller」で終わるクラスに継承されない限り。
私があなたなら、MVCソースを取得し、ソースコードを使用してテストMVCプロジェクトを作成します。これにより、例外が生成される場所を調べて、一般的なアイデアと強制された「*controller」命名規則について何ができるかを確認できます。 。