[.net mvc] Bind 三個關鍵字

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物件 

參考文章:

https://www.cnblogs.com/willick/p/3424188.html