2014-09-17 3 views
1

Учитывая метод контроллера, который возвращает IList<Scope> Где Scope содержит набор значений bool и некоторые дополнительные дочерние объекты.MVC5 каскадирование EditorFor в коллекции

public class Scope 
{ 
    public string Name { get; set; } 
    public bool A { get; set; } 
    public bool B { get; set; } 
    public bool C { get; set; } 
    public Investment Item { get; set; } 
} 

У меня есть основной вид со следующей разметкой:

@model IList<Scope> 
<div> 
    @Html.EditorForModel("Panel") 
</div> 

У меня есть мнение, называемое Panel.cshtml внутри EditorTemplates структурирован следующим образом:

@model IList<Scope> 
@for (int i = 0; i < Model.Count; i++) 
{ 
    <div class="panel panel-info"> 
     <div class="panel-heading"> 
      <p>@Model[i].Name</p> 
     </div> 
     <div class="panel-body"> 
      @Html.EditorFor(_ => _[i]) 
     </div> 
    </div> 
} 

EditorFor(_ => _[i]) не делает шаблон стандартного объекта с и для каждого поля по его типу?

Почему EditorFor не отображает редактор для каждого из свойств, когда он вызывается из другого редактора?

Если я переведу всю разметку с Panel.cshtml на главный вид, она работает правильно.
Невозможно получить такое же поведение из шаблона редактора?

+0

Просто любопытно, что делает ' @ Html.EditorFor (_ => _ [i]) 'делать? Должен ли я задать это как полный вопрос? –

+0

Его то же, что и HTML.EditorFor (model => model [i]). В функциональном программировании (пролог, f #, Haskell и т. Д.) Символ подчеркивания используется вместо полного имени переменной, когда контекст делает его однозначным. Я использую ту же краткую нотацию в C# lambdas, на мой взгляд, это лучше, чем писать x повсюду. – Jim

ответ

0

Вы можете перебирать EditorFor для каждого свойства модели:

@model IList<Scope> 
@for (int i = 0; i < Model.Count; i++) 
{ 
    <div class="panel panel-info"> 
     <div class="panel-heading"> 
      <p>@Model[i].Name</p> 
     </div> 
     <div class="panel-body"> 
      @Html.EditorFor(_ => Model[i].A) 
     </div> 
     <div class="panel-body"> 
      @Html.EditorFor(_ => Model[i].B) 
     </div> 
     . 
     . 
     . 
    </div> 
} 

или если вы не хотите, итерация EditorFor для каждого свойства модели попробуйте следующее:

@foreach (var scope in Model) 
{ 
    @Html.EditorFor(model => scope); 
} 
+0

Я пытаюсь избежать сценария, в котором мне нужно передать код каждой собственности. Я в идеале хочу, чтобы редактор объектов по умолчанию использовался, чтобы я не мог кодировать каждое свойство. – Jim

+0

Ответ был обновлен. –

+0

Привет, это то, что мне нужно, только оно не работает. Если я поместил foreach в Panel.cshtml, каждый из элементов цикла for будет отображаться как нуль «0» на странице. Редактор объектов по умолчанию (Object.ascx) не вызывается для каждого из элементов в foreach. – Jim

Смежные вопросы