我試圖更新舊的Web窗體應用程序以使用4.5中添加的新模型綁定功能,類似於MVC綁定功能。ASP.NET Web Forms 4.5模型綁定模型包含集合
我在製作可編輯的FormView時遇到了麻煩,它呈現的是包含簡單成員和包含其他模型集合的成員的單個模型。我需要用戶能夠編輯父對象的簡單屬性和子集合的屬性。
問題是在代碼嘗試更新模型時,模型綁定後子集合(ProductChoice.Extras
)始終爲空。
這裏是我的模型:
[Serializable]
public class ProductChoice
{
public ProductChoice()
{
Extras = new List<ProductChoiceExtra>();
}
public int Quantity { get; set; }
public int ProductId { get; set; }
public List<ProductChoiceExtra> Extras { get; set; }
}
[Serializable]
public class ProductChoiceExtra
{
public int ExtraProductId { get; set; }
public string ExtraName { get; set; }
public int ExtraQuantity { get; set; }
}
背後我的用戶控件代碼:
public partial class ProductDetails : System.Web.UI.UserControl
{
private Models.ProductChoice _productChoice;
protected void Page_Load(object sender, EventArgs e)
{
_productChoice = new Models.ProductChoice()
{
Quantity = 1,
ProductId = 1
};
_productChoice.Extras.Add(new Models.ProductChoiceExtra()
{
ExtraProductId = 101,
ExtraName = "coke",
ExtraQuantity = 1
});
_productChoice.Extras.Add(new Models.ProductChoiceExtra()
{
ExtraProductId = 104,
ExtraName = "sprite",
ExtraQuantity = 2
});
}
public Models.ProductChoice GetProduct()
{
return _productChoice;
}
public void UpdateProduct(Models.ProductChoice model)
{
/* model.Extras is always null here, it should contain two ProductChoiceExtra objects */
if (TryUpdateModel(_productChoice) == true)
{
}
}
}
我的控制標記:
<div id="selectOptions">
<asp:FormView runat="server" ID="fvProductSelection" DefaultMode="Edit"
ItemType="Models.ProductChoice"
SelectMethod="GetProduct"
UpdateMethod="UpdateProduct" >
<EditItemTemplate>
<asp:linkbutton id="UpdateButton" text="Update" commandname="Update" runat="server"/>
<asp:HiddenField runat="server" ID="ProductId" Value="<%# BindItem.ProductId %>" />
<asp:TextBox Text ="<%# BindItem.Quantity %>" ID="Quantity" runat="server" />
<asp:Repeater ID="Extras" ItemType="Models.ProductChoiceExtra" DataSource="<%# BindItem.Extras %>" runat="server">
<ItemTemplate>
<asp:HiddenField Value="<%# BindItem.ExtraProductId %>" ID="ExtraProductId" runat="server" />
<asp:Label Text="<%# BindItem.ExtraName %>" ID="Name" runat="server" />
<asp:TextBox Text="<%# BindItem.ExtraQuantity %>" ID="Quantity" runat="server" />
</ItemTemplate>
</asp:Repeater>
</EditItemTemplate>
</asp:FormView>
</div>
我試圖使Extras
屬性BindingList
而不是List
,但它沒有馬如有任何差異,Extras
集合未在UpdateProduct
方法中綁定。
你不能嘗試只傳入模型ProductChoice。 EG: 公共無效的UpdateProduct(ProductChoice模型) {} 好 – izip
問題@PaulD:我原以爲這FormView控件/中繼器的做法是很常見的(我的做法是相同的你) - 但我沒有也能夠破解這一個。 – Merenzo
我試圖實現一個自定義['System.Web.ModelBinding.IValueProvider'](http://msdn.microsoft.com/en-us/library/system.web.modelbinding.ivalueprovider(v = vs.110).aspx ),爲了對TryUpdateModel()使用[overload](http://msdn.microsoft.com/en-us/library/hh140347(v = vs.110).aspx),但是我的'IValueProvider'實現陷入了一個無限遞歸循環,因爲它反映了它通過對象屬性的方式...... – Merenzo