Ich versuche, eine alte Web Forms-Anwendung zu aktualisieren, um die in 4.5 hinzugefügten neuen Modellbindungsfunktionen zu verwenden, ähnlich den MVC-Bindungsfeatures.Bindung von ASP.NET Web Forms 4.5-Modellen, in der das Modell eine Auflistung enthält
Ich habe Probleme beim Erstellen eines bearbeitbaren FormView, das ein einzelnes Modell darstellt, das einfache Member sowie ein Member enthält, das eine Sammlung anderer Modelle darstellt. Ich brauche den Benutzer, um die einfachen Eigenschaften des übergeordneten Objekts und die Eigenschaften der untergeordneten Sammlung bearbeiten zu können.
Das Problem besteht darin, dass die untergeordnete Auflistung (ProductChoice.Extras
) immer Null nach Modellbindung ist, wenn der Code versucht, das Modell zu aktualisieren.
Hier sind meine Modelle:
[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; }
}
Und hinter meinem Benutzersteuercode:
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)
{
}
}
}
Meine Steuer Markup:
<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>
ich die Extras
Eigenschaft ein BindingList
machen versucht haben, eher als ein List
aber es war nicht ma ke Unterschied, die Extras
Sammlung ist nicht in der UpdateProduct
Methode gebunden.
Können Sie nicht einfach das Modell ProductChoice übergeben. Beispiel: public void UpdateProduct (ProductChoice Modell) { } – izip
Gute Frage @PaulD: Ich hatte gedacht, dass diese Formview/Repeater Ansatz ein allgemeines wäre (mein Ansatz ist es, Ihnen identisch) - aber ich habe nicht war in der Lage, diesen zu knacken. – Merenzo
Ich habe versucht, eine benutzerdefinierte ['System.Web.ModelBinding.IValueProvider '] (http://msdn.microsoft.com/en-us/library/system.web.modelbinding.ivalueprovider (v = vs.110) .aspx zu implementieren), um die [Überladung] (http://msdn.microsoft.com/en-us/library/hh140347 (v = vs.110) .aspx) für 'TryUpdateModel()', aber meinen 'IValueProvider' zu verwenden Implementierung wurde in einer unendlichen rekursiven Schleife festgefahren, als sie ihren Weg durch die Objekteigenschaften widerspiegelte ... – Merenzo