寫程式也一段時間,一直沒去搞懂一些東西
認真下定決心要去弄懂一些基礎知識
如有說錯也可以糾正<(-_-)>
要如何從畫面把資料傳給controller做處理呢?
1.傳統的方式把參數丟到網址上,http://localhost/Home/Index?name=123&id=123
接著在Controller使用Request.QueryString取得,Request.QueryString["name"]
2.如果今天表單是透過Post方式傳送出去
在Controller使用Request.Form取得,Request.Form["name"]
3.但如過參數很多,用上面兩種方式似乎太麻煩
在Mvc裡,有個Model BInding的機制,可以將傳到畫面上的資料,自動對應到Controller上的參數名稱
以下範例,把input的名稱設定name屬性,接著後端的contoller加上根name屬性一樣的參數名稱
這樣就會透過他的model binding機制,自動連結上
//View的畫面
@using (Html.BeginForm())
{
<input type="text" name="name" value="123"/>
<input type="submit" value="123"/>
}
//Controller畫面
public ActionResult Index(string name)
{
ViewBag.id = name;
return View();
}
4.使用FormCollection物件
差別在於,後面的Controller參數名稱改成FormCollection類別
在使用form["name"]來取得參數,跟使用Request物件取法差不多
//View的畫面
@using (Html.BeginForm())
{
<input type="text" name="name" value="123"/>
<input type="submit" value="123"/>
}
//Controller畫面
public ActionResult Index(FormCollection form)
{
ViewBag.id = form["name"]
return View();
}
5.透過類別取得參數
類別上的name屬性,跟前端畫面的name屬性會自動對應到(不分大小寫的)
//View的畫面
@using (Html.BeginForm())
{
<input type="text" name="name" value="123"/>
<input type="submit" value="123"/>
}
//Controller畫面
public ActionResult Index(Man man)
{
ViewBag.id = form["name"]
return View();
}
//類別
public class Man
{
public string Name { get; set; }
}
6.如果有多個Model呢?
一樣畫葫蘆,透過命名一樣的屬性名稱,就會自動把欄位對應到類別的屬性上
也可以用ViewModel來代替
但是有個重點,如果類別的屬性有一樣的名稱,在畫面上name屬性的設定要多一個參數名稱,參數名稱.參數屬性名稱
例如man.Id和aa.Id
//View的畫面
@using (Html.BeginForm())
{
<input type="text" name="name" value="123"/>
<input type="text" name="id" value="456"/>
<input type="submit" value="123"/>
}
//Controller畫面
public ActionResult Index(Man man,Test aa)
{
return View();
}
//Controller畫面,也可以把多個Model用ViewModel裝起來
public ActionResult Index(ViewModel viewmodel)
{
return View();
}
public class ViewModel
{
public Man man{get;set;}
public Test aa{get;set;}
}
//類別
public class Man
{
public string Id{get;set;}
public string Name { get; set; }
}
public class Test
{
public string Id { get; set; }
}