2012-01-24 13 views
1
<ul> 
    @{int i=0;} 
    @foreach (var entry in Model.PhoneNumberEntries) 
    { 
     <li> 
      <span>@entry.PhoneNumber<span> 
      @Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li> 
     i++; 
    } 
    </ul> 

Это кажется слишком многословным для меня ... есть способ обойти создание счетчика с необходимостью прибегнуть к стандарту для цикла?Есть ли более простой способ написать этот код html/бритвы?

+0

Что случилось с цикл? – jrummell

+0

@jrummell, они не принадлежат к представлениям. Циклы Foreach относятся к контроллерам, моделям, ... Представления используются только для отображения данных. Если вам нужно отображать коллекции данных, вы просто используете шаблоны редактора/отображения. –

ответ

6

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

Да, это кажется слишком многословным для меня. Даже цикл кажется слишком подробным, поскольку он вам не нужен, если вы используете шаблоны редактора.

<ul> 
    @Html.EditorFor(x => x.PhoneNumberEntries) 
</ul> 

и то, очевидно, вы должны определить пользовательский шаблон редактора, который будет автоматически вынесено для каждого элемента коллекции PhoneNumberEntries (~/Views/Shared/EditorTemplates/PhoneNumberEntry.cshtml):

@model PhoneNumberEntry 
<li> 
    <span>@Model.PhoneNumber</span> 
    @Html.EditorFor(m => m.PhoneNumber) 
</li> 

Вам даже не нужно писать циклы, как шаблоны работают по соглашению.

Обратите внимание, что имя и расположение шаблона редактора важны. Он должен быть расположен либо внутри ~/Views/Shared/EditorTemplates, если вы хотите поделиться этим шаблоном между представлениями, принадлежащими различным контроллерам в вашем приложении, и это то место, где ASP.NET MVC сначала ищет его. Или вы также можете поместить его в ~/Views/XXX/EditorTemplates, где XXX - это имя текущего контроллера. Тогда имя шаблона редактора должно быть именем типа, используемого как агрумент для свойства коллекции.

Так что, если у вас не было вашей основной модели вида:

public IEnumerable<FooBarViewModel> FooBars { get; set; } 

название соответствующего шаблона будет FooBarViewModel.cshtml и, очевидно, будет сильно типизированных к FooBarViewModel.

+0

Дарин - это отличная еда для размышлений. Кажется, я вижу, где вы здесь. Большое спасибо. –

2

Попробуйте это:

<ul> 
@for (int i=0; i++; i < Model.PhoneNumberEntries.Count) 
{ 
    <li>@Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li> 
} 
</ul> 
+0

Что делать, если 'Model.PhoneNumberEntries'' IEnumerable '? –

+0

Так как он использовал 'Model.PhoneNumberEntries [i]' в своем примере, это не выглядит как 'IEnumerable'. –

+0

правильный, извините, я не обратил на это внимания. –