ASP.NET MVC-Model Binding

  • 664
  • 0

寫程式也一段時間,一直沒去搞懂一些東西

認真下定決心要去弄懂一些基礎知識

如有說錯也可以糾正<(-_-)>

要如何從畫面把資料傳給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; }
}