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/