Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Преобразование объектов в моем представлении MVC3

Автор вопроса: Kevin CloetОтветов: 1

Пользователь может загрузить новый документ и добавить информацию, каждый документ имеет набор свойств по умолчанию. Администратор имеет возможность добавить небольшое количество дополнительных свойств. Он может добавить строку, логическое значение, значение даты и времени.

При создании моего представления я получаю Dictionary<String,Object> с дополнительными свойствами. На мой взгляд, я хочу создать правильный элемент управления для объекта. Поэтому, когда это объект даты и времени, я хочу загрузить календарь jquery, логический флажок и т. д.

@switch (Model.ExtraFields[i].PropertyType)
    {
        case (short)Enums.PropertyType.Boolean:
        @Html.TextBoxFor(model => Convert.ToBoolean(Model.Values[i].ExtraFieldValue))
   break;
        case (short)Enums.PropertyType.DateTime:
        @Html.TextBoxFor(model => Convert.ToDateTime(Model.Values[i].ExtraFieldValue))
   break;
        default:
        @Html.TextBoxFor(model => Model.Values[i].ExtraFieldValue)
        break;
    }

Всегда выдает ошибку на Convert.To...

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

Есть идеи?

razorviews

Ответы

Ответ 1 · рейтинг 1 · Buildstarted

Для EditorFor, TextBoxFor и т. д. требуется выражение, которое дает им доступ к метаданным используемого вами свойства. Convert.ToDateTime удаляет этот доступ (поскольку вместо этого возвращает значение), поэтому методы не знают, какое имя свойства использовать или какую-либо дополнительную информацию, такую ​​как атрибут [Display]. Я бы посоветовал вам сделать что-то вроде:

@switch (Model.ExtraFields[i].PropertyType) {
    case (short)Enums.PropertyType.Boolean:
        @Html.EditorFor(model => Model.Values[i].ExtraFieldValue, "BooleanEditor")
        break;
    case (short)Enums.PropertyType.DateTime:
        @Html.EditorFor(model => Model.Values[i].ExtraFieldValue, "DateTimeEditor")
        break;
    default:
        @Html.TextBoxFor(model => Model.Values[i].ExtraFieldValue)
        break;
}

Затем вы создаете EditorTemplates (как подкаталог вашего контроллера с определенными шаблонами с именем BooleanEditor.cshtml и т. д., например так:

@model object
@Html.CheckBox("", Convert.ToBoolean(Model))

оставив первый параметр пустым, вы будете автоматически использовать имя свойства, переданное через выражение из вызова EditorFor.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы