ASP.NET MVC 3 пользовательский шаблон отображения с UIHint - для цикла требуется? - PullRequest
8 голосов
/ 23 мая 2011

Если у меня есть ViewModel , например:

public class MyViewModel
{
   [UIHint("SomeTemplate")]
   public ICollection<SomeViewModel> Submodel { get; set; }
}

И строго типизированный Просмотр со строкой HTML, подобной этой:

@Html.DisplayFor(model => model.Submodel)

И шаблон отображения с такой подписью:

@model MvcApplication1.Models.SomeViewModel

Я получаю сообщение об ошибке, в котором говорится, что «элемент модели имеет тип List<SomeViewModel>, но для этого словаря требуется модель типа SomeViewModel.».

Это имеет смысл, но я бы надеялся, что встроенные шаблоны MVC сработают, увидят, что это что-то IEnumerable и сработают, чтобы вызвать мой шаблон N раз, как это обычно бывает для Html.DisplayFor без подсказки.

Похоже, [UIHint] переопределяет эту функциональность?

Очевидно, я могу указать на другой шаблон, который принимает коллекцию и вызывает Html.DisplayForModel(), в основном эмулируя смарт-коды MVC. Но я надеюсь избежать этого. Честно говоря, я бы предпочел сделать цикл foreach, чем шаблон с 1 строкой «оболочки».

Есть идеи получше?

Как будто я хочу сказать: «Эй, MVC, выдавай шаблон для каждого из этих парней. Но вместо использования соглашения имен для поиска шаблона, вот подсказка».

Ответы [ 3 ]

7 голосов
/ 23 мая 2011

UIHint означает «Рендеринг этой модели с использованием шаблона с именем XXX».Поэтому вы должны объявить свой шаблон отображения «SomeTemplate» с помощью

@model MvcApplication1.Models.ICollection<SomeViewModel>

и отобразить каждый элемент внутри foreach.

3 голосов
/ 07 июня 2013

Альтернативой является передача имени шаблона строки следующим образом

@Html.DisplayFor(model => model.Submodel, "SomeTemplate")
2 голосов
/ 06 июня 2013

Я столкнулся с той же проблемой. Похоже, UIHint по умолчанию игнорируется для сложных типов. Вы можете изменить поведение, но оно не является простым. Таким образом, более простое решение будет:

1) Удалить аннотацию UIHint. 2) Вместо этого убедитесь, что файл вашего шаблона отображения назван как имя типа, которое вы хотите, чтобы Html.DisplayFor автоматически перебирал. Поэтому в вашем случае назовите файл шаблона отображения как SomeViewModel.cshtml. Это должно работать. Нет необходимости явно использовать цикл for. Я пробовал это в MVC4, и он работает.

Я получил решение по следующей ссылке: http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of-knockout-js/

...