Ошибка при получении категорий из XML в Tridion (DD4T - MVC)
В представлении DD4T я пытаюсь выбрать значение Path для ключевого слова внутри категории.
foreach(var category in @Model.Categories)
{
if (category.Title.Contains("Taxonomy"))
{
str = category.Keywords[0].Path;
break;
}
}
но становится пустым в @Model.Categories.
Ошибка: ссылка на объект не установлена для экземпляра объекта.
Хотя данные существуют в XML.
Пожалуйста, предложите.
5 ответов
Я обнаружил, что это проблема в DD4T. Обходной путь довольно прост: если вы используете реализацию Component (или Page) в качестве модели, а не интерфейс, это работает.
Итак, начните свой взгляд с:
@model DD4T.ContentModel.Component
Скорее, чем
@model DD4T.ContentModel.IComponent
И попробуй еще раз.
Я зарегистрировал это как проблему на сайте Google Code DD4T здесь.
Похоже, это вызвано тем, что List и IList не поддерживают контрвариантность, а это означает, что такие строки:
IList<ICategory> IComponent.Categories
{
get { return Categories as IList<ICategory>; }
}
в классе ContentModel никогда не будет работать. Предложение копаться в том, чтобы изменить это на IEnumerable, который поддерживает противоположность.
Он работает после реализации предложения Quirijn, например Component c = (Component)Model; c.Categories[0]...
Спасибо, Викас Кумар
Да, сначала проверьте, опубликовали ли вы категории в базе данных брокера. Способ XML страницы или компонента десериализовать в объект IPage или IComponent довольно прост.
Также укажите, какую версию DD4T вы используете. Я помню, что была проблема с десериализацией в более ранних выпусках.