質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

5207閲覧

return View(model)とViewBag/ViewData(TempData)について

HikaruS.

総合スコア33

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/10/21 02:38

いつもお世話になっております。
ASP.net MVCについて学習中なのですが、いくつか存在している「ControllerからViewへ値を渡す方法」についての理解で少し混乱しています。

いくつかの参考サイトには、ControllerからViewへ値を渡す方法は ViewBagとViewData(+TempData) が存在する、と記載されています。
ですが、これら以外に 「return View(model)」もViewへ値を渡す方法である と記載されているサイトがあります。

この2種は私から見るとどちらもViewへ値を渡す方法であるように見えるのですが、これらを並列に記載しているサイトが多くないので混乱しています。両者は何かの観点で明確に異なるのでしょうか?

今の所、Microsoft Docsでのみ両者が並列に記載されていることを確認しています。

自分の知りたい内容がよくわかっていない(「違い」だけわかればいいのかどうかもよくわからない・少し混乱しています)ため、タイトルはふわっと書かせていただいているのですが、混乱している観点は以下のようなものです。

  • どちらもViewに値を渡すためのものではないのか?
  • 並列に書かれていない場合が多いのはなぜか?
  • 「Viewへ値を渡す方法」として「ViewBagとViewData」が書かれていることが多くて「return View()」が書かれていないことが多いのはなぜか?
  • 両者の違いは何か?

要領を得ない質問で申し訳ないのですが、何かご教授いただけますと幸いです。どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どちらもViewに値を渡すためのものではないのか?

そうです。

並列に書かれていない場合が多いのはなぜか?

それは単に質問者さんの見ているところがそうだからということだと思います。Model を使うか ViewData/ViewBag を使うかは適材適所です。

SQL Server などの DB にアクセスして Create, Read, Update, Delete (CRUD) 操作を行うなら Model を使うのがメインです。

単純に Controller から View に文字列を渡したいという場合は ViewData/ViewBag を使う方がよさそうです。

CRUD のために Model をメインに使っていても、ViewData/ViewBag を並行して使うケースもあります。例えば以下の記事の画像のドロップダウンリストのデータは ViewBag で渡しています。

スキャフォールディング機能
http://surferonwww.info/BlogEngine/post/2017/07/23/creating-controller-and-view-in-mvc-using-scaffolding-function.aspx

「Viewへ値を渡す方法」として「ViewBagとViewData」が書かれていることが多くて「return View()」が書かれていないことが多いのはなぜか?

そんなこともないと思いますけど? それも質問者さんが見ているところがたまたまそうだからでしょう。

例えば、上に紹介した記事の Index(レコードの一覧表示)のための Controller のアクションメソッドは以下のようにしています。

public class ProductsController : Controller { private NORTHWINDEntities db = new NORTHWINDEntities(); // GET: Products public ActionResult Index() { var products = db.Products.Include(p => p.Categories).Include(p => p.Suppliers); return View(products.ToList()); } }

products.ToList() で何が取得できるかと言うと、List<Products> 型のオブジェクトで、Products は Model です。既存のデータベースから Entity Data Model (EDM) を作った際 Products クラスが自動生成されます。参考に自動生成された Products クラスのコードを以下に貼っておきます。

namespace Mvc5App { using System; using System.Collections.Generic; public partial class Products { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Products() { this.Order_Details = new HashSet<Order_Details>(); } public int ProductID { get; set; } public string ProductName { get; set; } public Nullable<int> SupplierID { get; set; } public Nullable<int> CategoryID { get; set; } public string QuantityPerUnit { get; set; } public Nullable<decimal> UnitPrice { get; set; } public Nullable<short> UnitsInStock { get; set; } public Nullable<short> UnitsOnOrder { get; set; } public Nullable<short> ReorderLevel { get; set; } public bool Discontinued { get; set; } public virtual Categories Categories { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<Order_Details> Order_Details { get; set; } public virtual Suppliers Suppliers { get; set; } } }

MVC 全体で Model をどのように使うかは以下の画像を見てください。

イメージ説明

図では 3 つの異なる Model が存在するように見えますが、各 Model 間で重なっている部分があります・・・と言うか、上の Puroducts クラスの例では、3 つの場所で同じものを使うという感じです。

両者の違いは何か?

上に書いたことでその説明になっていると思いますが・・・

投稿2019/10/21 05:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HikaruS.

2019/10/21 06:59

SurferOnWwwさま いつもお世話になっております。頂いたご回答で必要な情報があらかた判りました。ご教示いただきありがとうございました。 3種類のモデルの概念については不知でした。今後確認したいと思います。 お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問