Борьба с SelectList в ASP.NET MVC 2 - PullRequest
       25

Борьба с SelectList в ASP.NET MVC 2

3 голосов
/ 15 февраля 2010

У меня есть модель, которая выглядит примерно так:

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 нет конструктора без параметров, поэтому он не может завершить привязку.

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

Некоторые вопросы:

  1. Как заставить Colors отображаться в виде меню для представления «Правка», а в виде простого строкового значения (например, «Зеленый») в представлении «Сведения»?
  2. Как предотвратить ошибку «без параметров без конструкторов» при обновлении модели, содержащей SelectList?
  3. Если моя Model / ViewModel действительно содержала внешний ключ, ColorId вместо Colors, то лучше всего было бы получить представление Details для отображения названия текущего цвета и представление Edit для отображения меню, содержащее все названия цветов, перечисленные в таблице Color моей базы данных. Если это помогает, я использую LinqToSql (SqlMetal) для генерации классов моей модели.

1 Ответ

3 голосов
/ 15 февраля 2010

Все ваши проблемы проистекают из того факта, что вы представляете SelectList как свойство модели. В зависимости от конкретной ситуации, я бы, вероятно, сделал что-то вроде:

  1. Создайте 3 отдельных класса моделей: одну модель «предметной области», состоящую из объектов LinqToSql (или оберток вокруг них) и двух моделей представления, одну для представления «Подробности» и одну для представления «Редактирование».

  2. Модель представления Подробности должна содержать название выбранного в данный момент цвета. Действие Details установит это свойство, используя отношение FK в объектах вашего домена или вручную просматривая сведения о выбранном цвете.

  3. Модель представления редактирования должна содержать свойство для идентификатора выбранного цвета. Он также должен содержать список выбора доступных вариантов цвета с выбранным значением, установленным на текущий выбранный идентификатор.

  4. Действие Edit, которое обрабатывает сообщение формы, должно принимать экземпляр модели представления Edit и должно отображать эти изменения в модели домена. Поскольку выбранному цвету предоставляется простое свойство, а не список выбора, его легко проверить и сопоставить с бизнес-объектом.

Если ваша ситуация очень проста, вы можете обойтись без единой модели представления как для просмотра, так и для редактирования, или даже передать объект домена непосредственно в представление сведений. В любом случае, пока вы удаляете SelectList из вашей модели и выставляете выбранный цвет в качестве простого идентификатора, с вами все будет в порядке.

...