2016年11月26日土曜日

ASP.NET MVC 06_ビューでHelloWorld(ビュー変数)

VisualStuidioCommunity2015/Fw4.5.2/C#


前回作成したビューに「Hello World」 を表示してみます。

ビューに表示する文字列「Hello World」をコントローラーのアクションメソッドで定義し、
ビューではコントローラーから受け取った文字列を表示します。

コントローラーとビューでデータを受け渡しする方法には、ビュー変数を利用する方法やモデルを利用する方法などがあります。
今回はビュー変数を利用します。

ビュー変数を利用すると手軽にコントローラーとビューで値の受け渡しができます。
その反面、コントローラーとビューの依存が高まります。
MVCパターンでは、コントローラーからビューにデータを渡す場合はモデルを使うことになっています。

ビュー変数とは、コントローラーとビューでデータを受け渡しできるコンテナー(値を詰め込めるもの)のことで、
Controllerクラスの親クラスであるControllerBaseクラスのViewDataプロパティやViewBagプロパティを利用します。

ControllerBase.ViewDataプロパティ

Controllerクラスの親クラスであるControllerBaseクラスのViewDataプロパティは、名称をキーに値を格納するコレクション(集まり)です。
まずはコントローラーのアクションで、キー「Message」 値「Hello World」をViewDataプロパティに格納します。

Controllers/HelloController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }

        public ActionResult Show()
        {
            //ViwDataはControllerの基底クラスであるControllerBaseクラスのプロパティ。
            //名称をキーに値を格納するコレクション。
            ViewData["Message"] = "Hello World";

            //ControllerクラスのViewメソッドはActionResult派生クラスであるViewResultクラスを返す。
            //ViewResultクラスはアクションメソッドの結果を対応するビューを表示する。
            return View();
        }
    }
}
次はShowビューのコードです。
HTMLにコードを埋め込むには「@」を使用します。
ViewDataに格納するキーは大文字小文字が区別されません。
ViewDataに格納していないキーを指定してもエラーにならず、何も出力されませんん。

Views/Hello/Show.cshtml

@{
    ViewBag.Title = "Show";
}

Show

ViewDataの値を表示する

Messageの値:@ViewData["Message"]

messageの値(キーは大文字小文字を区別しない):@ViewData["message"]

MSGの値(格納されていないキーを指定したときは何も表示されない):@ViewData["MSG"]



ControlBase.ViewBagプロパティ

Controllerクラスの親クラスであるControllerBaseクラスのViewBagプロパティは、dynamic型のプロパティです。
dynamic型とは匿名クラス(無名クラス)を格納する型で、そのプロパティなどはコンパイル時にチェックされず、実行時に解決されます。
つまり匿名クラスとは事前に定義されたクラスではないので、そのクラスのメンバー情報(プロパティなど)は何があるかコンパイラにはわかりません。
どんなプロパティ名を指定してもエラーにはなりません。(そのかわり、インテリセンスも効きません。)

33行目でViewBagpプロパティの匿名クラスに「Message」プロパティとその値を設定しています。
Controllers/HelloController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }

        public ActionResult Show()
        {
            //ViwDataはControllerの基底クラスであるControllerBaseクラスのプロパティ。
            //名称をキーに値を格納するコレクション。
            ViewData["Message"] = "Hello World";

            //ViewBagはControllerの基底クラスであるControllerBaseクラスのプロパティ
            //dynamic型の値を取得/設定できる。
            ViewBag.Message = "Hello World";

            //ControllerクラスのViewメソッドはActionResult派生クラスであるViewResultクラスを返す。
            //ViewResultクラスはアクションメソッドの結果を対応するビューを表示する。
            return View();
        }
    }
}
次はShowビューのコードです。
ViewDataと同様で
ViewBagプロパティの匿名クラスに設定されたプロパティ名は大文字小文字が区別されません。
匿名クラスに設定していないプロパティ名を指定してもエラーにならず、何も出力されませんん。

Views/Hello/Show.cshtml

@{
    ViewBag.Title = "Show";
}

Show

ViewDataの値を表示する

Messageの値:@ViewData["Message"]

messageの値(キーは大文字小文字を区別しない):@ViewData["message"]

MSGの値(格納されていないキーを指定したときは何も表示されない):@ViewData["MSG"]

ViewBagの値を表示する

Messageの値:@ViewBag.Message

messageの値(プロパティ名は大文字小文字を区別しない):@ViewBag.message

MSGの値(定義していないプロパティ名を指定したときは何も表示されない):@ViewBag.MSG

0 件のコメント: