3

具体的には、コントローラーのクラス名にはController接尾辞が必要ですか? また、必要に応じてプロジェクト内のフォルダー構造を変更することはできますか?

オーバーライドできる他の規則はありますか? また、その方法は?

4

1 に答える 1

3

フレームワークがどのように動作するかを知っていれば、ほとんどの規則は順応性があります。最大の慣習のうちの 2 つに取り組みましょう。

  1. ルートからコントローラーをインスタンス化するための「{controller}/{action}/」マジック キーワード

  2. フレームワークが最初にコントローラ ディレクトリでビューを検索し、次に Shared ディレクトリでビューを検索する方法。

MvcRouteHandler作成するすべてのルートは、デフォルトでオブジェクトのインスタンスに関連付けられています。ルートが一致すると、そのハンドラーが呼び出されて着信要求を処理します。MvcHandler の ProcessRequest は次のようになります。

protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
    this.AddVersionHeader(httpContext);
    string requiredString = this.RequestContext.RouteData.GetRequiredString("controller");
    IControllerFactory controllerFactory = this.ControllerBuilder.GetControllerFactory();
    IController controller = controllerFactory.CreateController(this.RequestContext, requiredString);
    if (controller == null)
    {
        throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.ControllerBuilder_FactoryReturnedNull, new object[] { controllerFactory.GetType(), requiredString }));
    }
    try
    {
        controller.Execute(this.RequestContext);
    }
    finally
    {
        controllerFactory.ReleaseController(controller);
    }
}

ハードコーディングされた文字列「controller」に注意してください。独自のコントローラー検索ロジックをコーディングする場合は、このハンドラーを任意のルートに置き換えることができます。次のようなことをするだけです(恥知らずなブログプラグイン)

routes.Add("ImagesRoute",
                 new Route("graphics/{filename}", new ImageRouteHandler()));

ルートが一致すると、独自のロジックが呼び出され、好きなことを行うことができます。ちなみに、「Controller」サフィックスを持つ XXXXController クラスを見つけるために使用されるリフレクションは、DefaultControllerFactory上記のハンドラーで呼び出されるオブジェクトの一部であり、このファクトリは置き換え可能です。

そのため、コントローラーの選択はオーバーライド可能な 1 つの規則です。return View()コントローラーメソッドから" " を実行するときにビューを探すときはどうですか? WebFormViewEngineフレームワークのデフォルトのビュー エンジンであるのコンストラクタは次のとおりです。

public WebFormViewEngine()
{
    base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.master", "~/Views/Shared/{0}.master" };
    base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.aspx", "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx" };
    base.PartialViewLocationFormats = base.ViewLocationFormats;
}

したがって、コントローラ ディレクトリを参照してから共有するという規則が気に入らなければ、簡単に拡張WebFormViewEngine(またはまったく別のビュー エンジンを使用) して、global.asax に追加できます。

ViewEngines.Engines.Add(new MyViewEngine());

MVC フレームワークの驚くべき点の 1 つは、その柔軟性です。そのほぼすべての部分を独自のロジックに置き換えることができます。また、すべてのコードを使用して、実行した内容を確認できます。

于 2010-01-23T07:46:20.053 に答える