У меня есть модель, которая выглядит примерно так:
public class SampleModel
{
public static SampleModel Create()
{
return new SampleModel
{
Boolean = true,
// set several more properties...
Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
};
}
public bool Boolean { get; set; }
// define several more properties...
public SelectList Colors { get; set; }
}
Я позволяю ASP.NET MVC автоматически создавать свойства, используя Html.DisplayForModel()
для моего представления «Подробности» и Html.EditorForModel()
для моего представления «Редактирование».
Результаты:
Представление «Правка» прекрасно работает. Colors
отображается как меню с тремя пунктами (красным, зеленым и синим), и по умолчанию выбран зеленый.
Однако для представления «Подробности» я получаю «False True False», которое, по-видимому, представляет собой список значений IsSelected
для каждого элемента меню. Это определенно не хочу, я хочу. Я бы хотел, чтобы он просто отображал «Зеленый».
Еще одна проблема заключается в том, что, если я пытаюсь выполнить UpdateModel(sampleModel)
в моем контроллере, я получаю ошибку: «Для этого объекта не определен конструктор без параметров». Вероятно, это связано с тем, что Colors
является SelectList
, а для SelectList
нет конструктора без параметров, поэтому он не может завершить привязку.
Итак, я думаю, что понимаю, в чем проблемы, но я действительно мог бы использовать хорошее решение для этого сценария, который, кажется, часто встречается, когда у вас есть модели объектов с внешними ключами.
Некоторые вопросы:
- Как заставить
Colors
отображаться в виде меню для представления «Правка», а в виде простого строкового значения (например, «Зеленый») в представлении «Сведения»?
- Как предотвратить ошибку «без параметров без конструкторов» при обновлении модели, содержащей
SelectList
?
- Если моя Model / ViewModel действительно содержала внешний ключ,
ColorId
вместо Colors
, то лучше всего было бы получить представление Details для отображения названия текущего цвета и представление Edit для отображения меню, содержащее все названия цветов, перечисленные в таблице Color
моей базы данных. Если это помогает, я использую LinqToSql (SqlMetal) для генерации классов моей модели.