Asp.Net MVC 2.0動的にMaster Pageデータをロードする(二)

3345 ワード

良い解決策


このセクションでは、コントローラの動作からビューマスターページへのデータの転送を実現するために、代替的でより良いソリューションをテストします.各コントローラの動作にムービー分類を追加するのとは逆に、ムービー分類をビューデータに1回だけ追加します.ビューマスターページで使用されるすべてのビューデータは、アプリケーションコントローラに追加されます.
  
ApplicationControlクラスはインベントリ4に含む.
インベントリ4-ControllersApplicationController.cs
using System.Linq;

using System.Web.Mvc;

using MvcApplication1.Models;



namespace MvcApplication1.Controllers

{



      public abstract class ApplicationController : Controller

      {



           private MovieDataContext _dataContext = new MovieDataContext();



           public MovieDataContext DataContext

           {

                get { return _dataContext; }

           }



           public ApplicationController()

           {

                ViewData["categories"] = from c in DataContext.MovieCategories

                          select c;

           }

      }

}


リスト4のApplicationControllerの3つの点に注意してください.まず、このクラスはSystemから継承する.Web.Mvc.Controllerベースクラス.アプリケーションコントローラはコントローラクラスです.
  
第二に、アプリケーションコントローラクラスは抽象クラスである.抽象クラスは、特定のクラスが実装しなければならないクラスです.ApplicationControllerは抽象クラスなので、クラス内のメソッドを呼び出すことはできません.アプリケーションコントローラクラスを直接呼び出したい場合は、リソースが見つかりません(Resource Cannot Be Found)というエラーメッセージが表示されます.
第三に、ApplicationControllerは、ムービー分類をビューデータに追加する構造関数を含む.ApplicationControllerクラスから継承されたコントローラクラスごとに、ApplicationControllerクラスのコンストラクタが自動的に呼び出されます.アプリケーションコントローラクラスから継承されたコントローラの動作を呼び出すたびに、映画分類は自動的にビューデータに含まれます.
 
インベントリ5のMoviesコントローラは、ApplicationControllerから継承される.
リスト5-ControllersMoviesController.cs
using System.Linq;

using System.Web.Mvc;



namespace MvcApplication1.Controllers

{



      public class MoviesController : ApplicationController

      {

           /// <summary>

           /// Show list of all movies

           /// </summary>

           public ActionResult Index()

           {

                ViewData["movies"] = from m in DataContext.Movies

                          select m;

                return View();

           }



           /// <summary>

           /// Show list of movies in a category

           /// </summary>

           public ActionResult Details(int id)

           {

                ViewData["movies"] = from m in DataContext.Movies

                          where m.CategoryId == id

                          select m;

                return View();

           }

      }

}


Moviesコントローラは,上記の節で論じたHomeコントローラについて,Index()とDetials()という2つの挙動方法を暴露した.マスターページに表示される映画分類リストはIndex()関数でもDetails()関数でもないことに注意してください.ムービーコントローラがApplicationControllerから継承しているため、ムービー分類リストは自動的にビューデータに追加されます.
 
このビュー・データを1つのビュー・マスター・ページに追加するソリューションは、DRYの原則に違反していないことに注意してください.ムービー分類リストをビューデータに追加するコードは、アプリケーションコントローラのコンストラクション関数という1つの場所にのみ存在します.

まとめ


このチュートリアルでは、コントローラからビュー・データをビュー・マスター・ページに渡す方法について説明します.まず,単純であるがメンテナンスが困難な方法をテストした.第1節では、各コントローラの動作にビュー・データをビュー・マスター・ページに追加する方法について説明します.DIYの原則に違反しているため,我々はそれが良い解決策ではないことで議論を終えた.
次に、比較的良い戦略をテストしました.各コントローラの動作にビューデータを追加するのとは異なり、アプリケーションコントローラにのみビューデータを追加しました.このようにすれば、コードの重複を避けることができます.
 
回転元:http://hi.baidu.com/aliasmic/blog/item/9bb4c3b5dc5d93798ad4b2ef.html