2012-06-13 4 views
0

Я использую вспомогательный помощник EditorForModel класса, который имеет свойство типа ICollection<int> unfortunatlly. Я не вижу свой рендер управления на своей странице.EditorForModel не отображает свойство ICollection

Вот пример:

Объект вид модели

public class CopyFromVM 
{ 

    [UIHint("MultiEntityList")] 
    public ICollection<int> EntityIds { get; set; } 
    ... 
} 

В папке EditorTemplate У меня есть файл MultiEntityList.cshtml

@model ICollection<int> 


<select name="@ViewData.ModelMetadata.PropertyName" id="@ViewData.ModelMetadata.PropertyName" multiple="multiple" > 
... 
</select> 

Когда форма визуализации я не» t есть какая-либо ошибка. Свойства просто игнорируются из рендеринга. Поэтому я подозреваю, что EditorForModel игнорирует сложный тип. Глядя на Интернет, он должен работать правильно для всех типов.

благодарит за помощь.

ответ

2

Ниже следует подобрать собственный шаблон из основного обзора:

@model CopyFromVM 
@Html.EditorFor(x => x.EntityIds) 

Следующие не будет:

@model CopyFromVM 
@Html.EditorForModel() 

Причиной этого является, потому что структура не рекурсии в комплекс свойства объекта. Вы можете изменить шаблон редактора по умолчанию Object.cshtml, как объяснил Брэд Уилсон в this blog post (см. Раздел «Неглубокое погружение против глубокого погружения» в конце его сообщения).

Также убедитесь, что ваш шаблон редактора помещен в правильную папку: ~/Views/Shared/EditorTemplates/MultiEntityList.cshtml, а не EditorTemplate, как указано в вашем вопросе (обратите внимание на отсутствующие s).


В качестве побочного замечания, то, как вы генерирующее имя и идентификационных атрибуты вашего списка выбора внутри шаблона редактора не является правильным, потому что вы не принимая во внимание уровня вложенности. Представьте себе, например, что CopyFromVM используется как свойство еще одной модели родительского представления. В этом случае имя избранного будет неправильно и модель Связыватель по умолчанию не сможет регидратацию значения: Используйте следующие вместо:

@model ICollection<int> 
<select name="@ViewData.TemplateInfo.GetFullHtmlFieldName("")" id="@ViewData.TemplateInfo.GetFullHtmlFieldId("")" multiple="multiple" > 
    ... 
</select> 

Ну, на самом деле, нет, у вас уже есть помощники, которые делают эта работа для вас @Html.ListBox. Элементы HTML-формы жесткого кодирования в представлениях ASP.NET MVC кажутся довольно хрупким процессом, который я бы рекомендовал вам избежать.


И еще одна сторона замечание: для того, чтобы сгенерировать список выбора обычно нужно 2 свойства на модели вида: один, который будет содержать выбранные значения и один, который будет содержать все значения. Так что строго набрав ваш шаблон редактора до ICollection<int>, это ИМХО неправильный подход здесь.

+0

:(Имо не имеет смысла не повторяться. Особенно, что у меня есть атрибут UIHint. У меня скорее есть атрибут, который перестает рекурсивно, например, ScaffoldColumn, и по умолчанию он должен возвращаться. Кровавая структура. много для информации. – mathk

+0

«s» - это опечатка в моем вопросе, извините за это. – mathk

+0

@mathk, абсолютно тривиально написать собственный шаблон редактора для 'Object.cshtml', если вам не нравится поведение по умолчанию и измените это поведение, чтобы оно соответствовало вашим потребностям. –

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