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

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

При создании моего представления я получаю 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.

Есть идеи?


person Kevin Cloet    schedule 11.07.2011    source источник


Ответы (1)


Для 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.

person Buildstarted    schedule 11.07.2011
comment
Хорошо, ошибка исчезла, и я могу отправить логическое значение. Но при изменении флажка он отправляет оба значения, и я получаю String[] как объект с [0] в качестве последнего выбранного значения и [1] в качестве первого значения: s - person Kevin Cloet; 11.07.2011
comment
Это потому, что Html.CheckBox и Html.CheckBoxFor создают как флажок, так и скрытый элемент ввода. Скрытое значение будет значением, которое было изначально задано моделью. Это для того, чтобы вы могли видеть, что изменилось. Я не изучал это слишком глубоко, но скрытое значение должно быть вашим вторым элементом. (Вы дали мне кое-что для исследования) - person Buildstarted; 11.07.2011
comment
Я заметил, что он всегда просто возвращает «String []», поэтому я просто конвертирую в него свой объект и просто получаю первое значение - person Kevin Cloet; 12.07.2011
comment
Да, потому что все значения по своей сути являются строками при работе со значениями публикации. Быстро найду пример переплета модели. - person Buildstarted; 12.07.2011