4

ビュー (FindUser.aspx) が部分ビュー (FindUser.ascx) をレンダリングしようとしているという問題に悩まされています。ビューのデフォルトの検索パスは、さまざまなフォルダー内のビューにちなんで名付けられたファイルを探します。驚くべきことに、ビューの場合、拡張子が .aspx または .ascx のファイルが検索されます。また、部分ビューは同じリストを使用します。

同じ名前の 2 つのファイルがあるため、ビューの解像度が最初にページを繰り返し見つけて、無限ループに陥ります。

ビューと部分ビューに別の名前を付けるか、検索場所をビューのみ .aspx に変更し、部分ビューのみ .ascx に変更することで、これを修正できることはわかっています。

私の質問は、MVC がデフォルトで両方の拡張子を参照するのはなぜですか? ビュー == ページ == .aspx と部分ビュー == コントロール == .ascx の方が理にかなっているようです。では、なぜ水を濁らせるのでしょうか。

4

6 に答える 6

2

あなたが抱えている問題を回避する方法は、異なるビュー名を使用することだと思います。拡張子だけが異なるファイル名のビューを 2 つ持つべきではありません。ただし、厳密な Page = View、Control = Partial マッピングが本当に必要な場合は、WebFormViewEngine から継承して独自の ViewEngine を作成し、ビューの場所の形式を変更してください。

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

次に、Application_Start() でビュー エンジンとして構成します。

// Call this method during Application_Start to setup your view engine
internal static void SetupViewEngines() {
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyWebFormViewEngine());
}
于 2009-04-28T15:53:54.730 に答える
1

価値があるのは、すべての .ascx ViewUserControls の名前に「Control」を追加することです。だから私は と を持っFindUser.aspxていFindUserControl.ascxます。問題は解決しませんが、名前の衝突を回避することで問題を回避するのに役立ちます。

于 2009-04-28T14:38:43.770 に答える
1

ビューをレンダリングするときに、MVC にダイレクト パスを指定できます。フォルダにがありFoo.aspx、に部分ビューがあるとします。アクション メソッドでは、次のいずれかを実行できます。HomeFoo.ascxShared

return View("~/Views/Shared/Foo.ascx"); // or
return View("~/Views/Home/Foo.aspx");

そして、それはあなたが探している適切なものを取得します。

于 2009-04-28T15:53:46.443 に答える
0

理由
ビュー == ASP.NET MVC の UserControl。


の名前を使用してください。

ヒント
アンダースコア プレフィックスを使用してユーザー コントロールに名前を付けるのが一般的な規則です。

于 2009-04-29T08:20:35.543 に答える
0

Areas を使用している場合は、コンストラクターに LocationFormats を追加する必要があります。

public class ExtensionBasedWebFormViewEngine : WebFormViewEngine
{
  public ExtensionBasedWebFormViewEngine()
  {
     ViewLocationFormats = new[] {"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx"};
     AreaViewLocationFormats = new[] {"~/Areas/{2}/Views/{1}/{0}.aspx", "~/Areas/{2}/Views/Shared/{0}.aspx"};

     PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
     AreaPartialViewLocationFormats = new[] { "~/Areas/{2}/Views/{1}/{0}.ascx", "~/Areas/{2}/Views/Shared/{0}.ascx" };
  }
}
于 2010-07-14T15:18:17.100 に答える