2016-06-02 3 views
0

У меня есть модель ClassA, которая имеет свойство, которое является массивом ClassB.Asp.Net MVC EditorFor Array с шаблоном

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; } 
} 

Я хотел бы отредактировать мои экземпляры ClassB в таблице. Я создал EditorTemplate для ClassB, который создает строку таблицы.

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

Это прекрасно работает на режиме редактирования для ClassA, так как MVC делает все индексирование поля сама магия:

@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> 

Однако, я на самом деле хотел бы создать шаблон редактора для массива, который включает в себя таблица тегов, как это:

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

Так что я могу просто сделать:

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

Однако при таком подходе индексация полей не применяется. Есть ли способ, которым я могу это сделать, не создавая сами имена текстовых полей? Являясь шаблоном, я не знаю имя свойства во время использования.

ответ

4

Я понял. Бритва довольно умная. Используя цикл вместо Еогеасп решает это:

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

Хотя это работает для вас, ваш отрицая один из основных преимуществ использования 'EditorTemplate', который должен быть в состоянии использовать' @ Html.EditorFor (м => m.SomeProperty) 'где' SomeProperty' может быть либо единственным экземпляром модели коллекции моделей. –

+0

Мой шаблон для массива ClassB имеет цикл for. Мой взгляд на ClassA использует @ Html.EditorFor (m => m.MySubCollection). –

+0

Ваш непонятный мой комментарий. Одним из преимуществ использования «EditorTemplate» является то, что вы можете передать ему один экземпляр класса «ClassB» или коллекцию «ClassB». Вы используете, что вы больше не можете использовать 'EditorFor (m => m.MySubCollection)', если 'MySubCollection' является typeof' ClassB' - теперь он работает только, если 'MySubCollection' является typeof' IEnumerable ' –