Controller Action 參數 Bind 有三個關鍵字
1.Exclude
2.Include
3.Prefix
由於今天看了一篇文章,才真正完全搞懂 這三關鍵字的用法。
所以在這邊做下紀錄
ViewModel 的建置(因版面關係 寫在同一個)
public class PersonViewModel {
public int PersonId { get ; set ; }
public string FirstName { get ; set ; }
public string LastName { get ; set ; }
public Address HomeAddress { get ; set ; }
}
public class Address {
public string City { get ; set ; }
public string Country { get ; set ; }
}
如果我們有一張表單
@model MvcApplication1.Models.PersonViewModel
...
@using(Html.BeginForm("DisplayAddress", "Home")) {
< div > @Html.LabelFor(m => m.PersonId)@Html.EditorFor(m=>m.PersonId) </ div >
< div >
@Html.LabelFor(m => m.HomeAddress.City)
@Html.EditorFor(m=> m.HomeAddress.City)
</ div >
< div >
@Html.LabelFor(m => m.HomeAddress.Country)
@Html.EditorFor(m=> m.HomeAddress.Country)
</ div >
< button type ="submit" > Submit </ button >
}
搭配的Action
public ActionResult DisplayAddress(Address address) {
return View( address);
}
View的輸出
@model MvcApplication1.Models.Address
@{
ViewBag.Title = "Address";
}
< h2 > Address Summary </ h2 >
< div >< label > City: </ label > @Html.DisplayFor(m => m.City) </ div >
< div >< label > Country: </ label > @ Html.DisplayFor(m => m.Country) </ div >
可以發現畫面是長這樣
值是沒有接到的,為什麼會這樣?
其實是因為 輸出過去是 PersonViewModel 物件 的 HomeAddress.City , HomeAddress.Country
在DisplayAddress 這個Action 接的參數是 Address 這樣是接不到的
所以可以在參數前面加上
public ActionResult DisplayAddress([Bind(Prefix="HomeAddress")]Address address) {
return View(address);
}
這樣就可以順利的接到值了
這在ViewModel 的傳輸上非常容易用到
而Include , Exclude 就相對更容易理解
public ActionResult DisplayAddress([Bind(Prefix = "HomeAddress", Exclude = "Country")]Address address) {
return View(address);
}
以上方為例,就是前綴字 是HomeAddress的,並且排除調Country 這個屬性 的Address物件
參考文章: