5

初めての ASP.NET MVC (2) CMS を完成させました。次のステップは、CMS のデータベースからのデータを表示する Web サイトを構築することです。これはウェブサイトのデザインです:

http://img56.imageshack.us/img56/4676/portal.gif http://img56.imageshack.us/img56/4676/portal.gif


#1 (赤いボックス) - 記事のカテゴリを表示します。ビューモデル:

public class CategoriesDisplay
    {
        public CategoriesDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }
    }

#2 (茶色のボックス) - 最後の x 件の記事を表示します。緑色のボックス #3 からはスキップします。ビューモデル:

public class ArticleDisplay
    {
        public ArticleDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }

        public int ArticleID { set; get; }

        public string ArticleTitle { set; get; }
        public string URLArticleTitle { set; get; }
        public DateTime ArticleDate;

        public string ArticleContent { set; get; }

    }

#3 (緑色のボックス) - 最後の x 件の記事を表示します。茶色のボックス #2 と同じ ViewModel を使用

#4 (青いボックス) - 今後のイベントのリストを表示します。dataContext.Model.EventViewModel として使用

ボックス #1、#2、および #4 はサイト全体で繰り返され、マスター ページの一部です。だから、私の質問は、このデータをモデルからコントローラー、そして最後にビューページに転送する最良の方法は何ですか?

  1. このすべてのクラスをまとめてラップするマスターページとViewModelクラスのコントローラーを作成する必要がありますか、または
  2. これらのボックスごとに部分ビューを作成し、それぞれが適切なクラスを継承するようにする必要があります (このように機能する可能性さえある場合) または
  3. この繰り返されるコードをすべてのコントローラーに配置し、ViewData を介してすべての追加データを転送する必要がありますが、これはおそらく悪い方法です :) または
  4. もっと簡単な方法があるかもしれませんが、私は知りません/見ませんか?


前もってありがとう、イル



編集:
答えが 1 の場合は、マスター ページのコントローラーを作成する方法を説明してください!

編集 2:
このチュートリアルでは、抽象クラスを使用してマスター ページにデータを渡す方法について説明します: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx
"リスト 5 – Controllers\MoviesController.cs "、データは、リポジトリからではなく、LINQ を使用してデータベースから直接取得されます。それで、これはこのチュートリアルだけにあるのでしょうか、それともここにいくつかのトリックがあり、リポジトリは使用できない/使用できないのでしょうか?

4

2 に答える 2

4

マスター ページにデータを取得するには:

  • 抽象クラスを使用してマスター ページにデータを取得するのは好きではありません。私は継承よりも構成を好みます。
  • ViewData ディクショナリは厳密に型指定されていないため、使用したくありません。

セクションごとにビュー、ビューモデル、およびアクションを作成します。次に呼び出しますHtml.RenderAction(...)例:

CategoriesDisplay.aspxredbox の html だけで作成します。CategoriesDisplay私はあなたのモデルを渡します。次に、私のコントローラーで:

public class CategoryController : Controller
{
    public ActionResult DisplayCategories()
    {
      var model = new CategoriesDisplay();
      ...
      return View(model);
    }
}

次に、マスターページで:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %>

これにより、CategoriesDisplay ビューがマスター ページ内にインラインでレンダリングされます。これにより、SOC (関心の分離)、クリーンで管理しやすいコードを使用できます。

于 2010-04-02T21:41:54.107 に答える
2

私もこれと戦った。最初に、余分なデータをViewDataに大量にダンプしましたが、最終的にはキャストバックする必要がありました(これを容易にするいくつかの拡張機能を作成しましたが、それでも素晴らしいとは言えません)。

私はあなたの選択#1を選び、必要なすべてのクラスをラップするViewModelを作成します。

于 2010-04-02T18:13:37.327 に答える