ASP.NET MVC Viewsのファイルについて

2012/03/15

基本的に、Viewsフォルダ内の指定フォルダの指定ファイルを読む。

考え方は「小枠のテンプレートの設定をして、大枠のテンプレートに渡す」って感じ。
個人的には「大枠のテンプレートがあって、小枠のテンプレートを読み込んでいく」ってのに慣れているので変な感じがする。

リクエストが「http://○○○/Home/Index/」の場合

「Global.asax」によって「/Views/Home/Index.aspx」に割り振られる。

「/Views/Home/Index.aspx」の中身について

  1. <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
  2.  
  3. <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
  4.   ホーム ページ
  5. </asp:Content>
  6.  
  7. <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  8.   <h2><%: ViewData["Message"] %></h2>
  9.   <p>
  10.     ASP.NET MVC の詳細については、<a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a> を参照してください。
  11.   </p>
  12. </asp:Content>

1行目の「MasterPageFile="~/Views/Shared/Site.Master"」がベースになる。とりあえずこれは後回し。
3行目の「ContentPlaceHolderID="TitleContent"」と7行目の「ContentPlaceHolderID="MainContent"」が重要。これが変数名で中身が値ってな感じ。PHPとかの「$i = 0」で「$i」が3行目・7行目にあたる。「0」が4行目や8~11行目にあたる。

「/Views/Shared/Site.Master」の中身について

  1. <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head runat="server">
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  7. <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
  8. <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
  9. </head>
  10.  
  11. <body>
  12.   <div class="page">
  13.  
  14.     <div id="header">
  15.       <div id="title">
  16.         <h1>マイ MVC アプリケーション</h1>
  17.       </div>
  18.  
  19.       <div id="logindisplay">
  20.         <% Html.RenderPartial("LogOnUserControl"); %>
  21.       </div>
  22.  
  23.       <div id="menucontainer">
  24.  
  25.         <ul id="menu">
  26.           <li><%: Html.ActionLink("ホーム", "Index", "Home")%></li>
  27.           <li><%: Html.ActionLink("このサイトについて", "About", "Home")%></li>
  28.         </ul>
  29.  
  30.       </div>
  31.     </div>
  32.  
  33.     <div id="main">
  34.       <asp:ContentPlaceHolder ID="MainContent" runat="server" />
  35.  
  36.       <div id="footer">
  37.       </div>
  38.     </div>
  39.   </div>
  40. </body>
  41. </html>

「ContentPlaceHolder」のある7行目(ID="TitleContent")と34行目(ID="MainContent")が「/Views/Home/Index.aspx」の3行目(ContentPlaceHolderID="TitleContent")と7行目(ContentPlaceHolderID="MainContent")に置き換えられる。

20行目(Html.RenderPartial)、26・27行目(Html.ActionLink)はHTMLの直書きを回避している。
「Html.ActionLink」はaタグのことで「<a href="http://○○○/Home/Index/">ホーム</a>」や「<a href="http://○○○/Home/Index/">このサイトについて</a>」と記載してもok。
「Html.RenderPartial」はわからない…。たぶん引数の「LogOnUserControl」からどっかでルーティングされていると思う。「Shared/LogOnUserControl.ascx」を読んでるんだろうなぁ。

ディレクティブ構文

上記の各ソースの1行目にある「@ Page」や「@ Master」のこと。
他にも「@ Control」とか「@ Import」とかいろいろある。

見ていると「@ Master」がHTMLソースの全体的な大枠、「@ Control」がフッターとかサイドメニューとかのような各パーツである小枠、「@ Page」がコンテンツ・本文って感じみたい。

「MVC」の「M」と「V」と「C」の繋がり

「http://○○○/Home/Index/」というリクエストがあった場合「Global.asax」で「/Views/Home/Index.aspx」を読む。
「/Views/Home/Index.aspx」の中で「MasterPageFile」の指定通り「/Views/Shared/Site.Master」を読む。

「/Views/Home/Index.aspx」の中にある「<%: ViewData["Message"] %>」は、「/Controllers/」内で指定。
「/Views/Home/Index.aspx」だから「/Controllers/」内の「HomeController.cs」の「HomeController.Index()」内で設定。

サンプルだと「ViewData["Message"] = "こんにちわ";」とかされており「M」である「/Models/」を使っていない…。

本来なら「/Models/」内でゴニョゴニョしてあげる。
「HomeController.cs」に「using MvcApplication3.Models;」を追加して「/Models/」を読み込んであげればゴニョゴニョした何かが利用可能になる。。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい