ASP.NET MVC 3 настраиваемый шаблон отображения с UIHint - для цикла требуется?

Если у меня есть ViewModel, как это:

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

И строго типизированный View с линией 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 ответа

Решение

UIHint означает "Рендеринг этой модели с использованием шаблона с именем XXX". Таким образом, вы должны объявить свой шаблон отображения "SomeTemplate" с

@model MvcApplication1.Models.ICollection<SomeViewModel>

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

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

@Html.DisplayFor(model => model.Submodel, "SomeTemplate")

Я столкнулся с той же проблемой. Похоже, что 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/

Другие вопросы по тегам