こんにちは。
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
です。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/17 02:30
2017/05/17 02:57 編集