8

Если у меня есть ViewModel так:ASP.NET MVC 3 Пользовательский шаблон отображения с UIHint - для Loop обязательно?

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.».

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

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

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

Любые лучшие идеи?

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

ответ

7

UIHint означает «Render this model using template by XXX». Таким образом, вы должны объявить displaytemplate «SomeTemplate» с

@model MvcApplication1.Models.ICollection<SomeViewModel> 

и отображать каждый элемент внутри Еогеасп.

+0

так что нет никакого способа, чтобы использовать MVC встроенный в шаблонных СМАРТС (неявный цикл), все еще используя uihint? – RPM1984

+0

Нет, не знаю. Даже если вы хотите его реализовать, что нужно сделать, чтобы окружить все элементы? В некоторых случаях это должна быть таблица, в других случаях - ul/ol. – mathieu

+0

Дело в том, что у меня уже есть шаблон отображения для 'SomeViewModel', но причина, по которой я использую UIHint, заключается в том, что я хочу переопределить этот шаблон по умолчанию с новым. Шаблоны по умолчанию для коллекции будут просто отображать индивидуальный шаблон N раз. Он не принимает решений по ul/table. Я просто хочу отобразить ** другой ** шаблон N раз. но похоже, что это невозможно сделать без цикла for, который вроде бы сосет. Я всегда стараюсь избегать циклов. – RPM1984

2

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

3

Альтернативой является передать имя шаблона строки, как следовать

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

Да, это приятно держать вещи в порядке. Может быть, пример поможет людям начать. – ppumkin

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

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