1

これまで ASP.NET MVC v1 および v2 で以下のコードを使用していましたが、今日アプリケーションにエリアを追加したところ、エリアのコントローラーが Areas/Views/controllerView フォルダーにビューを見つけることができませんでした。これらの 4 つの標準フォルダーを検索するという非常によく知られた例外を発行しましたが、領域の下は検索しませんでした..

エリアで動作するようにコードを変更するにはどうすればよいですか? Areas をサポートする ASP.NET MVC 2 のカスタム ビュー エンジンの例でしょうか。ネット上の情報は非常に少ないです..

コードは次のとおりです。

public class PendingViewEngine : VirtualPathProviderViewEngine
{
    public PendingViewEngine()
    {
        // This is where we tell MVC where to look for our files. 
        /* {0} = view name or master page name       
         * {1} = controller name      */
        MasterLocationFormats = new[] {"~/Views/Shared/{0}.master", "~/Views/{0}.master"};
        ViewLocationFormats = new[]
                                {
                                    "~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx",
                                    "~/Views/{1}/{0}.ascx"
                                };
        PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new WebFormView(partialPath, "");
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return new WebFormView(viewPath, masterPath);
    }
}
4

3 に答える 3

4

あなたの質問への直接の回答ではありませんが、他の読者が役に立つかもしれないカスタム ビューエンジンを使用するには、global.asax を変更する必要があります。

 void Application_Start(object sender, EventArgs e)
 {
  RegisterRoutes(RouteTable.Routes);
  ViewEngines.Engines.Clear();
  ViewEngines.Engines.Add(new PendingViewEngine());
 } 
  • マット
于 2010-10-04T12:42:45.993 に答える
2

...これらの 4 つの標準フォルダーを検索しましたが、エリアの下には表示されませんでした

これは実際にはヒントです。カスタム ビュー エンジンで場所が定義されていないため、MVC はエリア ビューの場所と方法を知りません。

これはエリア対応アプリケーションであるため、場合によっては をセットアップしてプロパティに場所AreaPartialViewLocationFormatsを含める必要がある場合があります。AreasViewLocationFomats

ViewLocationFormats = new[]
{
   "~/Areas/Views/{1}/{0}.aspx",
   ...
};

そしておそらく...

AreaPartialViewLocationFormats = new[]
{
    "~/Areas/{1}/Views/{0}.ascx",
    "~/Areas/Views/{1}/{0}.ascx",
    "~/Views/Shared/{0}.ascx"
};

2 つの参照:

  1. MSDN <-おそらくMVC1以降に更新されて、新しいエリアのものを含めるようになったため、機能しないのはなぜですか
  2. The Haack <- 古い投稿ですが、良い紹介と概要です
于 2010-05-07T07:07:16.820 に答える
0

Area を作成したときに、AreaRegistration クラスを作成しましたか? もしそうなら、これはあなたの中にありますglobal.asax.csか?その名の通り、領域をMVCに登録します。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    }
于 2010-05-06T19:06:39.480 に答える