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

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

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

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

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

2回答

4433閲覧

ASP.NET WebアプリケーションのViewとControllerの関係を知りたいです。

cancat

総合スコア313

MVC

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

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2017/05/16 02:44

こんにちは。
Windows10でASP.NETのアプリケーションを開発しています。
Visual Studio 2017 Communityを使っています。

###前提・実現したいこと
ASP.NET Webアプリケーション(.NET Framework)のViewとControllerの関係について疑問があります。
Create.cshtmlを開いたときはControllerのCreate(),、
Create.cshtmlでcreateを押したときは、ControllerのCreate([Bind(Include = "Id,Name,email")] Person person)
が、動きます。

Q1)ASP.NETでないFormやWPFのC#の場合、同じ名前のMethodがふたつある場合、引数をつけて実行するMethodを選択できます。
Create();と実行すればCreate()を、
Create(person)と実行すればCreate(person)を実行します。
とすると、
createボタンでCreate([Bind(Include = "Id,Name,email")] Person person)を実行するということは、createボタンを押したときは、自動的にpersonを引数に取るのでしょうか?

Q2)そうだとすると、この引数のpersonはどこで定義しているのでしょうか?
Create.cshtmlの1行目の
@model ConnectionList.Models.Person
のmodelがそうでしょうか?

Q3)なぜその定義した引数が、
<input type="submit" value="Create" class="btn btn-default" />
だけでついていくの?

Q4)もしボタンが複数あって
<input type="submit" value="Create" class="btn btn-default" />
<input type="button" value="Cancel" class="btn" />//これでOK?
Cancelメソッドがあるとしたら、そこにもpersonはついていくの?

Q5)とすると
<input type="submit" value="Create" class="btn btn-default" />
<input type="button" value="Cancel" class="btn" />//これでOK?
に対応するControllerは、
public ActionResult Cancel()
{
}
ではなくて、
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Cancel([Bind(Include = "Id,Name,email")] Person person)
{
}
でないとだめ?

Q6)するとcshtmlの冒頭では、変数を定義できる、ということ?

Q7)その変数は、cshtmlごとにひとつに限定? それとも複数定義できるの?

Q8)複数定義したときは、Createで受ける引数はふたつになる?

と次々と疑問が噴出してまいりました。
ご助言お願いします。

###試したこと
新規プロジェクトで、ASP.NET Webアプリケーション(.NET Framework)を選択。
ASP.NET4.5.2テンプレートはMVCを選択。
認証は個別のユーザーアカウントを選択。

ModelフォルダにPersonクラスを作成。
###発生している問題・エラーメッセージ

###該当のソースコード

C#

1namespace ConnectionList.Models 2{ 3 public class Person 4 { 5 public int Id { get; set; } 6 public string Name { get; set; } 7 public string email { get; set; } 8 } 9}

Controllersフォルダを選択して、追加-新規スキャフォールディングアイテムを選択。
MVC-コントローラ-Entity Frameworkを使用した、ビューがあるMVC5コントローラーを選択。
モデルクラスにPerson(ConnectionList.Models)、データコンテキストクラスにApplicationDbContext(ConnectionList.Models)を選択して追加。

これで、CURDができました。

PeopleController.csのうちCreateの部分は下記のとおりです。

C#

1namespace ConnectionList.Controllers 2{ 3 public class PeopleController : Controller 4 { 5 // GET: People/Create 6 public ActionResult Create() 7 { 8 return View(); 9 } 10 11 // POST: People/Create 12 [HttpPost] 13 [ValidateAntiForgeryToken] 14 public ActionResult Create([Bind(Include = "Id,Name,email")] Person person) 15 { 16 if (ModelState.IsValid) 17 { 18 db.People.Add(person); 19 db.SaveChanges(); 20 return RedirectToAction("Index"); 21 } 22 23 return View(person); 24 } 25 26 } 27}

Create.cshtmlの抜粋は下記のとおりです。

@model ConnectionList.Models.Person @{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Person</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.email, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.email, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.email, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> }

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ルーティングとかポストとかパラメータとかの話ですかね。
MVCの基本的な話なので長々と書くよりは色んなサイトとか見てもらった方が早いと思います。

連載:ASP.NET MVC入門

投稿2017/05/16 06:17

編集2017/05/16 07:15
workaholist

総合スコア559

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

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

cancat

2017/05/17 02:30

それは充分読みました。
workaholist

2017/05/17 02:57 編集

大体答えが書いてあるような気もしますが。 例えば <form action="/Hello/Post/" method="post"> としたらHelloコントローラのPostアクションメソッドが呼ばれる、と記事には説明されているので、Q5のような質問は出ないですよね? <input type="button" value="Cancel" class="btn" />//これでOK? というのもただの何も動作しないボタンでしかないですよね? どの遷移先(どのコントローラのどのアクション)に飛ぶのか書いていないので動作しません。(これはHTMLレベルの話かな?)
guest

0

View Controller Modelの概念が必要です。
ViewとControllerの関係性ですが、
ControllerがModelの振り分けを行う司令塔で、
ViewはControllerで指定されたModelを表示するテレビです。

投稿2017/05/16 08:40

King_of_Flies

総合スコア382

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

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

cancat

2017/05/17 02:30

それはわかっているつもりなので、具体例を。
King_of_Flies

2017/05/17 08:04

Q1)Bindあんま使わないから分からない。すいません。 Q2)持ってるパラメータはご指摘の通り一行目で宣言しているモデルの中身のプロパティです。 Q3)submitはformを送信する処理になります。Html.beginfrom内で宣言されているパラメータを全て投げます。 Q4)submitでないと付いてこないと思いますが間違ってたらすいません。 Q5)bindよく分からない・・・ Q6)行頭で宣言している@model うんたらは変数の定義してるModelを読み込んでます。 ごちゃごちゃになってるようなのでModelを勉強してください。 Q7)複数は出来ませんが、継承等はできます。 Q8)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問