Преобразование объектов в моем MVC3 View - PullRequest
0 голосов
/ 11 июля 2011

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

При создании моего просмотра я получаю Dictionary<String,Object> с дополнительными свойствами. На мой взгляд, я хочу создать правильный элемент управления для объекта. Поэтому, когда это объект datetime, я хочу загрузить календарь 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.

Есть идеи?

1 Ответ

1 голос
/ 11 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...