Жизненный цикл модели MVC3 - PullRequest
       4

Жизненный цикл модели MVC3

1 голос
/ 30 сентября 2011

Я надеюсь, что кто-то может прояснить, как модель должна развиваться с помощью обратных передач, используя следующий пример:

MyModel

public class MyModel
{
    public string Text { get; set; }

    public List<RadioButtonListItem> Options { get; set; }

    public MyModel()
    {
        //Initialize the options.
        this.Options = new List<RadioButtonListItem>()
        {
            //Setting Text, Value and Group Name. 3rd is selected by default.
            new RadioButtonListItem("Item 1", "1", "Options"),
            new RadioButtonListItem("Item 2", "2", "Options"),
            new RadioButtonListItem("Item 3", "3", "Options", true)
        };
    }
}

RadioButtonListItem

public class RadioButtonListItem
{
    [HiddenInput]
    public string Value { get; set; }

    [HiddenInput]
    public string Text { get; set; }

    [HiddenInput]
    public string GroupName { get; set; }

    [HiddenInput]
    public string SelectedValue { get; set; }

    [TemplateVisibility(ShowForEdit = false)]
    public override bool Selected { get { return string.Equals(this.Value, this.SelectedValue); } set { this.SelectedValue = (value ? this.Value : null); } }

    public RadioButtonListItem() { }

    public RadioButtonListItem(string value, string text, string groupName) : this(value, text, groupName, false) { }

    public RadioButtonListItem(string value, string text, string groupName, bool selected)
    {
        //...
    }
}
  1. Контроллер запускает индексное представление, передавая новую модель.Параметры по умолчанию, третий вариант выбран по умолчанию.
  2. Теперь отображаемые поля формы включают в себя в основном всю модель, включая значение, текст и имя группы каждого RadioButtonListItem.
  3. ПользовательЗаполняет форму и нажимает кнопку Отправить.
  4. Контроллер HttpPost получает модель.Модель заполняется из опубликованных данных, включая RadioButtonListItems и все их свойства.
  5. Некоторая запись в форме неверна, поэтому тот же экземпляр модели отправляется обратно в представление, таким образом,записи и выборы пользователя сохраняются.
  6. Пользователь исправляет ошибку, повторно отправляет форму, все хорошо.

Резюме

Это кажется мне страннымпотому что я на самом деле не думаю, что вам нужно отправлять обратно исходные метаданные, чтобы сохранить состояние модели.Но если вы не отправите его обратно, что вы будете делать?Я могу вспомнить только один другой вариант: во время постбэк создайте второй экземпляр модели и скопируйте выбор пользователя в новый экземпляр и верните его обратно в представление.

Но это не кажется правильныммне.Может кто-нибудь уточнить, как это должно работать?

1 Ответ

0 голосов
/ 30 сентября 2011

Я не очень четко думал, когда задавал этот вопрос. Элементы в списке, конечно же, не нужно отправлять обратно с почтовыми данными. Вы просто сохраняете отдельный список в модели, который инициализируете в конструкторе, а затем получаете поле int, которое является идентификатором или ключом элемента, выбранного из списка.

Модель выглядит так:

[Required]
[DataType("RadioButtonList")]
[Display(Name = "Format", Order = 2)]
[AdditionalMetadata("Style", "Wide")]
[AdditionalMetadata("List", "Items")]
public int? SelectedItem { get; set; }

[TemplateVisibility(ShowForDisplay = false, ShowForEdit = false)]
public List<ListItem> Items { get; set; }

Указывает на собственный список с атрибутом AdditionalMetaData. Таким образом, вы легко можете RadioButtonList EditorTemplate загрузить список и просто отправить обратно, какой элемент был выбран. Это значение будет заполнено в свойстве SelectedItem.

...