2016-06-02 9 views
0

Ich habe ein Modell der KlasseA, die eine Eigenschaft hat, die ein Array von ClassB ist.Asp.Net MVC EditorFor Array mit Vorlage

public class ClassA 
{ 
    public string ClassAProperty1 { get; set; } 
    public string ClassAProperty2 { get; set; } 
    public ClassB[] MySubCollection { get; set; } 
} 

public class ClassB 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

Ich möchte meine Instanzen von ClassB in einer Tabelle bearbeiten. Ich habe ein EditorTemplate für ClassB erstellt, das eine Tabellenzeile erstellt.

@model ClassB 
    <tr> 
     <td>@Html.TextBoxFor(m => m.Prop1)</td> 
     <td>@Html.TextBoxFor(m => m.Prop2)</td> 
    </tr> 

Dies funktioniert gut auf der Bearbeitungsansicht für KlasseA da MVC nicht alle Feldindizierung Magie selbst:

@Html.TextBoxFor(m => m.ClassAProperty1) 
@Html.TextBoxFor(m => m.ClassAProperty2) 

<table> 
    <tr> 
     <th>Col</th> 
     <th>Col</th> 
    </tr> 
    @Html.EditorFor(m => m.MySubCollection) 
</table> 

aber ich würde wirklich gerne eine Editor-Vorlage für das Array erstellen, die folgenden beinhaltet die Tabelle Tag wie folgt:

@model ClassB[] 
<table> 
    <tr> 
     <th>Col</th> 
     <th>Col</th> 
    </tr> 
    @foreach(var item in Model) 
    { 
     @Html.EditorFor(m => item) 
    } 
</table> 

So kann ich einfach tun:

@Html.TextBoxFor(m => m.ClassAProperty1) 
@Html.TextBoxFor(m => m.ClassAProperty2) 
@Html.EditorFor(m => m.MySubCollection) 

Die Feldindexierung wird jedoch bei diesem Ansatz nicht angewendet. Gibt es eine Möglichkeit, dies zu erreichen, ohne die Textboxnamen selbst erstellen zu müssen? Als Vorlage kenne ich den Namen der Eigenschaft zum Zeitpunkt der Verwendung nicht.

Antwort

4

Ich fand es heraus. Rasiermesser ist ziemlich schlau. eine for-Schleife anstelle eines foreach löst es:

@for (var i = 0; i < Model.Length; i++) 
{ 
    @Html.EditorFor(c => Model[i]) 
} 
+1

Während dies für Sie arbeitet, Ihre negiert eines der wichtigsten Vorteile der Verwendung eines 'EditorTemplate' die' @ Html.EditorFor (m verwenden zu können, ist => m.SomeProperty) 'where' SomeProperty' kann entweder eine einzelne Instanz eines Modells einer Kollektion von Modellen sein. –

+0

Meine Vorlage für ein Array von ClassB hat die for-Schleife. Meine Ansicht für ClassA verwendet @ Html.EditorFor (m => m.MySubCollection). –

+0

Sie verstehen meinen Kommentar nicht. Einer der Vorteile von 'EditorTemplate' besteht darin, dass Sie eine einzelne Instanz von' ClassB' oder eine Sammlung von 'ClassB' übergeben können. Sie verwenden bedeutet, dass Sie 'EditorFor (m => m.MySubCollection)' nicht mehr verwenden können, wenn 'MySubCollection' typeof' ClassB' ist - es funktioniert jetzt nur, wenn 'MySubCollection' typeof' IEnumerable ' –