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

5534 ワード

[翻訳]ASP.NET MVC教程-データをビューマスターページ2009-11-20 11:05 A.Mに転送します. 
住所:http://www.asp.net/learn/mvc/tutorial-13-cs.aspx
  
マスターページにデータを転送します.
このチュートリアルの目的は、どのようにデータをコントローラからビューマスターページに渡すかを説明することです.マスターページに対する2つの転送データの戦略を試験した.まず,簡単なスキームを議論したが,このスキームは適用が維持しにくいことをもたらした.次に,より良い解を試験した.もっと早い作業が必要ですが、もっとメンテナンスしやすい応用ができます.
問題
あなたが映画データベースアプリケーションを作成していることを想像して、アプリケーションの各ページに映画分類リストを表示したいです.また、この映画の分類表はデータベースの表に保存されています.したがって、これらの分類をデータベースから検索して、一つのビューマスターページに表示することは明らかに興味深い.
図1:マスターページで映画のカテゴリを表示する
 
問題が出ました.メインページではどのように映画の分類リストを検索しますか?直接マスターページでモデル類を呼び出す方法は明らかに魅力的です.つまり、あなたのテンプレートページでデータベースのデータを検索するのは魅力的です.しかし、あなたのMVCコントローラを迂回して接触データベースを取得すると清潔な懸念点から分離されます.このMVC応用の最も主要な利点の一つです.
MVCアプリケーションでは、すべてのMVCビューとMVCモデルの交換はMVCコントローラで行いたいです.この注目点の分離は、より維持可能で、より強い適応性とより強いテスト的なアプリケーションを意味する.
MVCアプリケーションでは、すべてのデータが一つのビューに転送されます.ビューマスターページを含めて、コントローラの動作によってビューに伝達されるべきです.また、データはビューデータの利点を利用して伝達されるべきである.この教程の残りの部分では、ビューのマスターページにデータを送る方法をテストしました.
簡単な解決策
簡単な解決策から始めましょう.この簡単な解決策は、各コントローラの動作において、ビューデータをマスターページに転送することです.
リスト1のコントローラを考慮してください.それはIndex()とDetials()という二つの行為を暴露しました.Index()行動方法はMoviesデータベーステーブルのすべての映画に戻りました.Details()挙動方法は特定の映画分類のすべての映画を返します.
リスト1-Controller\HomeController.cs
using System.Linq;

using System.Web.Mvc;

using MvcApplication1.Models;



namespace MvcApplication1.Controllers

{



      [HandleError]

      public class HomeController : Controller

      {

           private MovieDataContext _dataContext = new MovieDataContext();

 

           /// <summary>

           /// Show list of all movies

           /// </summary>

           public ActionResult Index()

           {

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

                          select c;

                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["categories"] = from c in _dataContext.MovieCategories

                          select c;

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

                          where m.CategoryId == id

                          select m;



                return View();

           }

      }

}
Index()とDetails()の挙動は両方ともビューデータに追加されていることに注意してください.Index()挙動には2つのキーが追加されています.Categoriesキー.Moviesキーは、Indexビューでも表示される映画のリストを表しています.
Details()行動にはcategoriesとmoviesという2つのキーが追加されています.Categoriesキーは、もう一度、親ページで表示される映画の分類を表しています.Moviesキーは、Detailsビューページによって表示される特定のカテゴリ(図2)を表します.
図2:Details図
 
Indexビューはリスト2に含まれています.ビューデータの中でmovies項によって表される映画リストを簡単に繰り返します.
リスト2-Views\Home\Index.aspx  
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>

<%@ Import Namespace="MvcApplication1.Models" %>



<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

<ul>

<% foreach (var m in (IEnumerable<Movie>)ViewData["movies"])

      { %>

      <li><%= m.Title %></li>

<% } %>

</ul>



</asp:Content>

 ビューマスターページはリスト3.ビューマスターページで反復され、ビューデータから得られたcategories項で表されるすべての映画の分類をレンダリングします.
 
リスト3-Views\Shared\Site.master 
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs" Inherits="MvcApplication1.Views.Shared.Site" %>

<%@ Import Namespace="MvcApplication1.Models" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

      <title></title>

      <asp:ContentPlaceHolder ID="head" runat="server">

      </asp:ContentPlaceHolder>

</head>



<body>

      <div>

           <h1>My Movie Website</h1>

           <% foreach (var c in (IEnumerable<MovieCategory>)ViewData["categories"])

      {%>

                <%= Html.ActionLink(c.Name, "Details", new {id=c.Id} ) %>

           <% } %>

           <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

           </asp:ContentPlaceHolder>

      </div>

</body>

</html>

すべてのデータはビューデータを介してビューとマスターページに渡されます.これはマスターページにデータを送る正しい方法です.
この解決策の問題はどこにありますか?問題はこの案がDRY(Don't Repeat Yourself)の原則に違反していることです.各コントローラの動作は、同じ映画分類リストを表示データに追加する必要があります.アプリケーションに重複したコードがあると、あなたのアプリケーションの維持が難しくなり、適応性が悪くなり、修正も難しくなります.
回転:http://hi.baidu.com/aliasmic/blog/item/9bb4c3b5dc5d93798ad4b2ef.html