2012-06-11 39 views
5

提供類使用模型綁定

public class Person 
{ 
    // Some general properties 

    public List<Hobby> Hobbies { get; set; } 
} 

public class Hobby 
{ 
    // Some properties e.g. Name, etc. 
} 

static List<Hobby> AllHobbies { get; } 

是否有可能創建一個視圖,允許用戶使用模型綁定來選擇自己的愛好選擇MVC 4從列表 項目?

這肯定會是可能的視圖來遍歷AllHobbies並呈現針對每個的<input type="checkbox" />,然後在回發控制器用手線了所選擇的值。看來這應該可以通過模型綁定來實現,但我不知道如何。

回答

11

當然,我會推薦你​​使用編輯器模板。

讓我們假設一個愛好有一個名字和一個布爾字段,指示是否它是由用戶選擇的:

public class Hobby 
{ 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

然後控制器到模型送入視圖和處理表單提交:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var person = new Person 
     { 
      Hobbies = new[] 
      { 
       new Hobby { Name = "hobby 1" }, 
       new Hobby { Name = "hobby 2", Selected = true }, 
       new Hobby { Name = "hobby 3" }, 
      }.ToList() 
     }; 
     return View(person); 
    } 

    [HttpPost] 
    public ActionResult Index(Person person) 
    { 
     var selectedHobbies = person 
      .Hobbies 
      .Where(x => x.Selected).Select(x => x.Name); 
     string message = string.Join(",", selectedHobbies); 
     return Content("Thank you for selecting: " + message); 
    } 
} 

然後將含有形式允許用戶選擇嗜好的視圖:

@model Person 

@using (Html.BeginForm()) 
{ 
    <h2>Hobbies</h2> 
    @Html.EditorFor(x => x.Hobbies) 
    <button type="submit">OK</button> 
} 

和它會自動被渲染爲Hobbies集合中的每個元素的相應的編輯器模板(~/Views/Home/EditorTemplates/Hobby.cshtml - >注意,模板的名稱和位置很重要):

@model Hobby 

<div> 
    @Html.LabelFor(x => x.Selected, Model.Name) 
    @Html.HiddenFor(x => x.Name) 
    @Html.CheckBoxFor(x => x.Selected) 
</div> 

對於更高級的編輯場景我會建議您閱讀關於此主題的Steven Sanderson的blog post

+0

+1,很棒的信息。然而'Hobby'類沒有(也不應該)具有布爾值,指示特定用戶是否從領域模型的角度選擇了它(這是一個簡單的例子)。我是否需要向對象添加一個臨時布爾字段來支持此操作,還是有另一種方法可以在沒有額外字段的情況下執行綁定? –

+4

不,您的錯誤是您將域模型傳遞給您的視圖。這是錯誤的。你應該定義一個視圖模型。在這個視圖模型中,您將擁有一個布爾型「Selected」屬性,該屬性允許您使用視圖內的複選框並獲取用戶選定的值。然後,您會將結果映射到您的域模型,以執行您需要的任何操作。記住MVC中最重要的規則:控制器操作只傳遞視圖中的/從視圖中查看模型。不是域模型。視圖模型是您專門設計的類,以滿足給定視圖的要求。 –

+0

您能推薦一種模式,以便在域模型和視圖模型之間進行高效(如花在編碼和測試上的時間)映射嗎?這實際上是第一個實例(雖然我做了很少的UI開發),兩者之間有任何區別。 –