2016-04-12 8 views
0

Ich kann nicht herausfinden, wie Modellbindung in Webformularen zu dem Auffüllen einer unterordneten Auflistung eines Ansichtsmodells verwandt wird. Angenommen, ich habe folgendes:ASP.NET Web Forms Modellbindung verschachtelte Auflistung

public class MeasurementViewModel 
{ 
    public string Name {get;set;} 
    public int MeasurementTypeId {get;set;} 
    public double Value {get;set;} 
} 
public class ExperimentViewModel 
{ 
    public bool ExperimentAorB {get;set;} 
    public List<MeasurementViewModel> Measurements {get;set;} 
} 

So gibt es zwei Arten von Experimenten, A oder B, von denen jede einen anderen Satz von Messungen erfordern. Ich möchte dies alles auf einer Seite tun, so dass der Benutzer den Testtyp auswählt und dann die Liste der Messungen anzeigt, die über einfache Textfelder einzugeben sind. Das ist in MVC einfach, aber ich stecke mit Webformularen fest, in denen nicht klar ist, wie das geht.

<asp:DropDownList ID="ddExperiment" runat="server" CssClass="form-control" AutoPostBack="true" 
    DataValueField="Id" DataTextField="Description" 
    SelectMethod="ddPartCode_GetData" /> 
<asp:FormView ID="Entry" RenderOuterTable="false" runat="server" DefaultMode="Insert" Visible="<%# !string.IsNullOrEmpty(ddExperiment.SelectedValue) %>" 
    ItemType="ExperimentViewModel" SelectMethod="Entry_GetItem" InsertMethod="Entry_InsertItem"> 
    <EditItemTemplate> 
    <asp:TextBox ID="txtName" Text="<%# BindItem.Name %>" runat="server" /> 
    <!-- ??? --> 
    </EditItemTemplate> 
</asp:FormView> 

Das Einsatzverfahren der Formview ist wie folgt:

public void Entry_InsertItem(ExperimentViewModel item) 

ich verschiedene Markup in die versucht haben ??? Abschnitt, wie ein Listview mit einem Select mit dieser Signatur:

public IEnumerable<MeasurementViewModel> Measurements_GetData(
    [Control("ddExperiment")] int experimentType) ... 

Das funktioniert die richtige Form angezeigt werden, sondern auf Postbacks ExperimentViewModel.Measurements ist immer null. Ich habe auch versucht, Methoden in der Listenansicht und einen Repeater ohne Erfolg zu verwenden.

Ich kann das natürlich manuell tun, aber ich dachte, dass es einen Standard Weg geben muss, dies mit Modellbindung zu tun. Offensichtlich muss ich ein Steuerelement definieren, das tatsächlich an das ExperimentViewModel.Measurements bindet, aber ich bin nicht sicher, wie man das in diesem Setup macht.

+0

Die gleiche Lösung wie hier gepostet gilt: http://stackoverflow.com/questions/36804682/web-forms-model-binding-child-collection – naasking

Antwort

0

Sie können ein Kind ListView mit DataSource="<%# Item.Measurements %> binden. Hier ein Beispiel:

<asp:FormView ID="FormView" runat="server" RenderOuterTable="false" ItemType="ExperimentViewModel" DataKeyNames="Id" DefaultMode="Edit" SelectMethod="FormView_GetItem" UpdateMethod="FormView_UpdateItem"> 
     <EmptyDataTemplate> 
      The record you requested does not exist. 
     </EmptyDataTemplate> 
     <EditItemTemplate> 
     <asp:ListView ID="ListView" runat="server" ItemType="MeasurementViewModel" DataKeyNames="Id" DataSource="<%# Item.Measurements %>"> 
     ... 
     </asp:ListView> 
    </EditItemTemplate> 
</asp:FormView> 

ich nicht sicher bin, dass die Werte auf Postbacks bevölkert wird. Möglicherweise müssen Sie das Modell in der Einfügemethode erneut auffüllen. Ich bin mir nicht sicher, was genau Sie in der Kindvorlage vorhaben. Hoffe das hilft.

+0

Das Auffüllen der Child-Auflistung auf Postback ist das Problem. Was Sie vorgeschlagen haben, funktioniert nicht, ebenso wenig wie SelectMethod in der verschachtelten ListView. Betrachten Sie ein ExperimentEntryForm, in dem Sie den Typ des Experiments auswählen und eine Liste der Messungen (Schlüssel/Wert-Paare) für diese Art von Experiment erhalten. Wie würden Sie dies unter Verwendung der Bindung von Web Forms-Modellen darstellen, sodass ExperimentViewModel.Meascements beim FormView-Update-Ereignis aufgefüllt wird? Es gibt zur Zeit keine Antwort: http://stackoverflow.com/questions/21667583/asp-net-web-forms-4-5-model-binding-where-the-model-contains-a-collection – naasking

Verwandte Themen