2014-01-23 5 views
1

В моем приложении MVC4 у ​​меня есть часть администратора. В этом админ-представлении я вижу всех зарегистрированных пользователей (пока) принятых пользователей. Это представление также является редактором для ienumerable. Для того, чтобы иметь редактор для IEnumerable, я добавил IList и петли, как это, на мой взгляд:IList для привязки к модели в MVC4

@model IList<PlusPlatform.Models.UserProfile> 

@{ 
    ViewBag.Title = "Manage"; 
} 

<h2>@ViewBag.Title</h2> 
@using (Html.BeginForm()) 
{ 
    <table> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(model => model.UserName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.FirstName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.LastName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.DepartmentId) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.IsActivated) 
      </th> 
     </tr> 

@for (var i = 0; i < Model.Count(); i++) { 
    <tr> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].UserName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].FirstName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].LastName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].DepartmentId) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].IsActivated) 
     </td> 
    </tr> 
} 
</table> 
<input type="submit" value="Save" /> 
} 

Но теперь проблема я не могу использовать Html.DisplayNameFor и Html.LabelFor. Что я могу сделать, чтобы правильно отобразить этикетки?

ответ

1

Если вы не очень заботятся о IList<T>, вы можете изменить свою модель на IEnumerable<T>. DisplayNameFor метод имеет перегрузку IEnumerable, это означает, что вы будете в состоянии сделать это:

@model IEnumerable<PlusPlatform.Models.UserProfile> 
... 
<th> 
    @Html.DisplayNameFor(model => model.UserName) 
</th> 

LabelFor не имеет такой перегрузки, потому что label следует использовать для конкретного элемента, например:

@Html.LabelFor(modelItem => Model[i].UserName) 

EDIT:

Если вы тусклый размещать эти данные в контроллер, лучше создать EditorTemplate, имя его UserProfile :

@model PlusPlatform.Models.UserProfile 
<tr> 
    <td> 
     @Html.EditorFor(m=> m.UserName) 
    </td> 
    <td> 
     @Html.EditorFor(m=> m.FirstName) 
    </td> 
    <td> 
     @Html.EditorFor(m=> m.LastName) 
    </td> 
    <td> 
     @Html.EditorFor(m=> m.DepartmentId) 
    </td> 
    <td> 
     @Html.EditorFor(m=> m.IsActivated) 
    </td> 
</tr> 

Тогда в представлении избавиться от цикла:

@model IEnumerable<PlusPlatform.Models.UserProfile> 
@using (Html.BeginForm()) 
{ 
    <table> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(model => model.UserName) 
      </th> 
      ... 
     </tr> 
     @Html.EditorForModel() 
    </table> 
} 
+0

Мне очень нравится IList, потому что, когда я использую 'IEnumerable ', при отправке формы контроллеру модель будет равна null. – devqon

+0

@ user3153169, см. Отредактированный ответ. – Zabavsky

0

Попробуйте как этот

@using (Html.BeginForm()) 
{ 
    <table> 
     <tr> 
      <th> 
       <[email protected](m =>m.First().UserName)</label> 
      </th> 
      <th> 
       <label>@Html.DisplayNameFor(m =>m.First().FirstName)</label> 
      </th> 
      <th> 
       <label>@Html.DisplayNameFor(m =>m.First().LastName)</label> 
      </th> 
      <th> 
       <label>@Html.DisplayNameFor(m =>m.First().DepartmentId)</label> 
      </th> 
      <th> 
       <label>@Html.DisplayNameFor(m =>m.First().IsActivated)</label> 
      </th> 
     </tr> 

@for (var i = 0; i < Model.Count(); i++) { 
    <tr> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].UserName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].FirstName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].LastName) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].DepartmentId) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => Model[i].IsActivated) 
     </td> 
    </tr> 
} 
+0

Я знаю, что это работает правильно, но разве это не плохая практика? Скажем, я меняю отображаемое имя модели, а затем метки не будут обновляться. – devqon

+0

Как это ответить на вопрос? OP явно хочет воспользоваться преимуществами аннотаций данных. – Zabavsky

+0

@ user3153169 проверить отредактированный ответ – Nilesh

0

Если вы можете использовать EditorFor таким образом, то почему бы не Displayfor? Попробуйте это

@Html.LabelFor(modelItem => Model[0].FirstName) 
Смежные вопросы