2011-07-09 167 views
1

如何製作默認的模型綁定手柄列表?模型綁定到列表

比方說,我有一個ShoppingCart類,它具有的ShoppingCartItem列表:

Public Class ShoppingCart 
    Public Property CouponCode As String 
    Public Property Items As New List(Of ShoppingCartItem) 
End Class 

Public Class ShoppingCartItem 
    Public Property Title As String 
    Public Property Count As Integer 
End Class 

我的看法是這樣的(按照從this的建議,並this,博客帖子):

@ModelType VAVTag.LuckyDraw.ShoppingCart 

@Code 
    Layout = Nothing 
End Code 
<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>Index</title> 
</head> 
<body> 
    @Using Html.BeginForm() 
    @<fieldset> 
     <legend>ShoppingCart</legend> 
     @Html.TextBoxFor(Function(m) m.CouponCode) 
     <hr /> 
     @Html.EditorFor(Function(m) m.Items) 

     <p> 
     <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
    End Using 
</body> 
</html> 

使用EditorTemplate呈現項目(謝謝Darin):

@ModelType ShoppingCartItem 
@Html.EditorFor(Function(m) m.Title) 
@Html.EditorFor(Function(m) m.Count) 
<br /> 

在我的控制器中,我插入一些隨機數據,視圖很好地呈現了我的購物車,並帶有三個項目。

Public Class ShoppingCartController 
    Inherits System.Web.Mvc.Controller 

    Function Index() As ActionResult 
    Dim model As New ShoppingCart 
    model.Items.Add(New ShoppingCartItem With {.Count = 1, .Title = "Item A"}) 
    model.Items.Add(New ShoppingCartItem With {.Count = 17, .Title = "Item B"}) 
    model.Items.Add(New ShoppingCartItem With {.Count = 100, .Title = "Item C"}) 

    Return View(model) 
    End Function 

    <HttpPost()> 
    Function Index(model As ShoppingCart) As ActionResult 
    Return View(model) ' model is empty! 
    End Function 
End Class 

但是,當我提交頁面時,沒有值被拾取,甚至沒有CouponCode字段。模型對象是空的。是什麼賦予了?

最終,我的目標是通過javascript添加/刪除客戶端項目,然後讓模型綁定器在頁面提交時自動獲取更改。

更新:我只是從模型屬性聲明中錯過了Property關鍵字。太晚了,我得睡一覺。 :)

回答

2

我該如何製作默認的modelbinding句柄?

默認的模型粘合劑already handles lists and dictionaries完全沒問題。

只需使用編輯器模板。例如:

視圖模型:

public class ShoppingCartItem 
{ 
    public string Title { get; set; } 
    public int Count { get; set; } 
} 

public class ShoppingCart 
{ 
    public string CouponCode { get; set; } 
    public List<ShoppingCartItem> Items { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new ShoppingCart 
     { 
      Items = new[] 
      { 
       new ShoppingCartItem { Count = 1, Title = "Item A" }, 
       new ShoppingCartItem { Count = 17, Title = "Item B" }, 
       new ShoppingCartItem { Count = 100, Title = "Item C" }, 
      }.ToList() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ShoppingCart model) 
    { 
     return View(model); 
    } 
} 

查看:

@model ShoppingCart 
@{ 
    Layout = null; 
} 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Index</title> 
</head> 
<body> 
    @using (Html.BeginForm()) 
    { 
     <fieldset>   
      <legend>ShoppingCart</legend> 
      @Html.TextBoxFor(x => x.CouponCode) 
      <hr/> 
      @Html.EditorFor(x => x.Items) 
     </fieldset> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    } 
</body> 
</html> 

,最終將呈現每個項目的編輯模板(~/Views/Home/EditorTemplates/ShoppingCartItem.cshtmlItems集合:

@model ShoppingCartItem 
@Html.EditorFor(x => x.Title) 
@Html.EditorFor(x => x.Count) 
+0

是的,這是我鏈接到的博文。但它不適合我,我不明白爲什麼。在Scotts的例子中,視圖模型本身是一個集合,而在我的場景中,列表是模型中的一個屬性。 –

+0

@Jakob Gade,你應該使用編輯器模板,而不是在視圖中編寫一些醜陋的循環,並手動嘗試生成輸入字段名稱。我已經更新了我的答案,以舉例說明你。看看這是多麼容易?不需要編寫任何循環和難看的視圖,也不需要擔心字段名稱。一切都按照慣例很好地工作。對不起,我的VB.NET很生疏,但翻譯起來應該是微不足道的。 –

+0

謝謝,很好的例子,我會試試看。 –