MVC3模型生命周期

时间:2011-09-30 01:01:38

标签: asp.net-mvc-3 post model

我希望有人可以通过以下示例澄清模型应该如何通过回发进行:

为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. Controller触发索引视图,传递新模型。选项默认,默认选择第三个选项。
  2. 现在,呈现的表单字段基本上包括整个模型,包括每个RadioButtonListItem的值,文本和组名。
  3. 用户填写表单并单击“提交”按钮。
  4. HttpPost控制器接收模型。该模型从发布的数据中重新填充,包括RadioButtonListItems及其所有属性。
  5. 某些表单条目不正确,因此将相同模型实例发送回视图,这样就可以保留用户的条目和选择。
  6. 用户修复错误,重新提交表单,一切都很好。
  7. 摘要

    这对我来说似乎很奇怪,因为我真的认为你不应该发回原始元数据,以便可以保持模型状态。但如果你不发回去,你会怎么做?我只能想到另一个选项:在回发期间创建第二个模型实例并将用户的选择复制到新实例并将其反馈给视图。

    但这对我来说似乎不对。有人可以澄清这应该如何运作吗?

1 个答案:

答案 0 :(得分:0)

当我问这个问题时,我并没有想清楚。当然,列表中的项目不需要与发布数据一起发回。您只需在构造函数中初始化的模型中保留一个单独的列表,然后有一个int字段,该字段是从列表中选择的项目的ID或键。

该模型如下所示:

[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属性中。