2010-09-14 1 views
8

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

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBox("name",p.name) %> 
    <%: Html.ValidationMessage(p.name) %> 
    </td> 

<% } %> 

Я желая реорганизовать это, чтобы воспользоваться сильно типизированными html-помощниками в mvc2. Я с трудом понимаю, как создавать лямбда-выражения, и надеялся на какую-то помощь. следующее мне кажется не совсем правильным.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBoxFor(???) %> 
    </td> 

<% } %> 

ответ

8

Прежде всего, вы не должны быть итерация в представлении. Итерация означает, что циклы, циклы означают, что C#/VB.NET, C#/VB.NET в представлении приводит к коду спагетти.

Я бы рекомендовал вам использовать Editor Templates. Таким образом, вам не нужно писать циклы в ваших представлениях. Добавьте следующий файл в ~/Views/Home/EditorTemplates/PictureModel.ascx:

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %> 
<td> 
    <%: Html.TextBoxFor(x => x.name) %> 
    <%: Html.ValidationMessageFor(x => x.name) %> 
</td> 

Обратите внимание, что парциальное теперь сильно типизированных к whoozit.Models.PictureModel вместо IList<whoozit.Models.PictureModel>. Теперь все, что осталось, чтобы включить этот частичный из главного вида:

<%: Html.EditorFor(x => x.Pictures) %> 

Где Pictures это свойство типа IList<whoozit.Models.PictureModel> на вашей основной модели представления. Это автоматически вызовет частичное для каждого элемента коллекции, так что вам не нужно писать уродливые циклы в ваших представлениях.

Это просто работает по соглашению: часть должна называться PictureModel.ascx как имя типа элементов списка и находится в ~/Views/Home/EditorTemplates или ~/Views/Shared/EditorTemplates папке.

Редактор/Дисплей шаблоны сделают ваши взгляды более элегантными.

Замечание: В .NET соглашение - это имена свойств, начинающиеся с заглавной буквы, поэтому я бы рекомендовал вам переименовать свойство name в Name. Чувствуется более естественным писать и читать:

<%: Html.TextBoxFor(x => x.Name) %> 
1
<%= Html.TextBoxFor(p => p.name) %> 
+0

это дает ошибку «IList не содержит определение имени ...'переменная' p 'имеет тип List , а не изображение, поэтому я не могу получить доступ к полю имени – yamspog

1

Вы сообщаете свой частичный вид ожидать список whoozit.Models.PictureModel пунктов. Тогда ваш foreach ищет whoozit.Models.Picture not PictureModel. Ниже приведен пример того, как я обычно буду делать что-то подобное. Убедитесь, что ваш список, который вы пытаетесь перечислить, является правильным. Если класс изображения поступает из коллекции внутри PictureModel, убедитесь, что вы выполняете модель. Независимо от в foreach.

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

<% foreach(var p in Model) { %> 
<td> 
<%: Html.TextBoxFor(p => p.name) %> 
<%: Html.ValidateFor(p => p.name) %> 
</td> 
<% } %> 
2

Вы можете использовать строго типизированные вспомогательные методы, перейдя через модель с циклом for. Это также сделает уникальный атрибут httml-name таким, чтобы привязка модели могла помочь вам сопоставить значения с вашей моделью в ситуации сохранения.

<% for (int i = 0; i < Model.Count; i++) { %> 

    <%: Html.TextBoxFor(m => m[i].Name) %> 
    <%: Html.TextBoxFor(m => m[i].SomethingElse) %> 

<% } %> 

подробнее здесь .. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

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

  • Нет связанных вопросов^_^