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
Details()行動にはcategoriesとmoviesという2つのキーが追加されています.Categoriesキーは、もう一度、親ページで表示される映画の分類を表しています.Moviesキーは、Detailsビューページによって表示される特定のカテゴリ(図2)を表します.
図2:Details図
Indexビューはリスト2に含まれています.ビューデータの中でmovies項によって表される映画リストを簡単に繰り返します.
リスト2-Views\Home\Index.aspx
リスト3-Views\Shared\Site.master
この解決策の問題はどこにありますか?問題はこの案がDRY(Don't Repeat Yourself)の原則に違反していることです.各コントローラの動作は、同じ映画分類リストを表示データに追加する必要があります.アプリケーションに重複したコードがあると、あなたのアプリケーションの維持が難しくなり、適応性が悪くなり、修正も難しくなります.
回転:http://hi.baidu.com/aliasmic/blog/item/9bb4c3b5dc5d93798ad4b2ef.html
住所: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