ASP.NET MVC をいじっていて、質問がありました。あるいは、私がこれを間違っているのではないかと心配しているのかもしれません。私の翼を少し伸ばすために、不自由なサイトに取り組んでいます。申し訳ありませんが、この質問はまったく簡潔ではありません。
よし、これがシナリオだ。ユーザーがホーム/インデックスにアクセスすると、ページには製品のリストと記事のリストが表示されます。ファイルレイアウトは次のとおりです(DALは私のデータアクセスレイヤーです):
コントローラー 家 索引 ビュー 家 インデックスは ViewPage から継承します 製品 List は ViewUserControl<IEnumerable<DAL.Product>> から継承します シングルは ViewUserControl<DAL.Product> から継承します 論文 List は ViewUserControl<IEnumerable<DAL.Article>> から継承します シングルは ViewUserControl<DAL.Article> から継承します
Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerable<DAL.Product> and a IEnumerable<DAL.Article>.
View.Home.Index will use those view entries to call:
Html.RenderPartial("~/Views/Product/List.ascx", ViewData["ProductList"])
and Html.RenderPartial("~/Views/Article/List.ascx", ViewData["ArticleList"])
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
View.Article.List does something similar to View.Product.List
ただし、このアプローチは失敗します。このアプローチは私には理にかなっていますが、これらの MVC プラットフォームの経験が豊富な人なら、より良い方法を認識するでしょう。
上記は、View.Product.List 内でエラーを生成します。Html.RenderPartial("Single",...)
「Single」ビューが見つからなかったと不平を言う呼び出し。エラーは次のことを示しています。
部分ビュー 'Single' が見つかりませんでした。次の場所が検索されました。 ~/Views/Home/Single.aspx ~/Views/Home/Single.ascx ~/Views/Shared/Single.aspx 〜/Views/Shared/Single.ascx
Product のビューから RenderAction() を呼び出していたので、ランタイムが Views\Product 内の "Single" ビューを探すことを期待していました。ただし、ルックアップは、現在のビューではなく、元のビュー (/Controller/Home によって呼び出された /Views/Product) を呼び出したコントローラーに関連しているようです。
したがって、次のように Views\Product を変更することでこれを修正できます。
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("~/Views/Product/Single.ascx", product);
それ以外の
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
この修正は機能しますが、ビューのフル パスを指定する必要がある理由がわかりません。相対名が元のコントローラーのビュー パスではなく、現在のビューのパスに対して相対的に解釈されることは、私には理にかなっています。現在のビューではなく、コントローラーのビューに関連する名前を解釈することが役立つ便利なケースは考えられません (それらが同じである典型的なケースを除いて)。
この頃、私はクエスチョンマークを持っているべきですか?これを強調することは、実際には問題です。