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