如何在mvc.net中绑定模型,其中模型包含下拉列表?

时间:2014-08-02 08:55:28

标签: c# asp.net-mvc asp.net-mvc-4 razor

如果我有一个具有以下结构的ViewModel:

public class FormViewModel
{
    public string Name { get; set; }
    public List<OptionGroup> Options { get; set; }
    public string Comments { get; set; }
}

public class OptionGroup
{
    public string OptionType;
    public IEnumerable<SelectListItem> Options { get; set; }
    public string SelectedOption;
}

我希望使用以下签名发布到Controller方法:

    [HttpPost]
    public ActionResult PostForm(FormViewModel model)
    {
        // do stuff
    }

如何绑定剃刀中的SelectLists,以便在发送回服务器时正确绑定所选值?

我的第一直觉是尝试:

        foreach (OptionGroup optionGroup in Model.Options)
        {
            <div class="form-group">
                <label>@optionGroup.OptionType</label>
                @Html.DropDownListFor(m => optionGroup.SelectedOption, optionGroup.Options, optionGroup.OptionType, new { @class = "form-control" })
            </div>
        }

但这导致根本没有任何选项返回服务器。

然后我发现Scott Hanselman的这篇文章:

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

尝试使用for循环:

        for (int i = 0; i < Model.Options.Count; i++)
        {
            <div class="form-group">
                <label>@Model.Options[i].OptionType</label>
                @Html.DropDownListFor(m => m.Options[i].SelectedOption, Model.Options[i].Options, Model.Options[i].OptionType, new { @class = "form-control", name = string.Format("model.Options[{0}].SelectedOption", i) })
            </div>
        }

这会绑定选项列表,但无法填充选定的值。 (即我在服务器上获得了一个选项列表,但选项的所有属性都是空的)

我能找到的所有示例都使用简单的可枚举作为整个视图模型 - 当它们只是完整ViewModel的一部分时,如何绑定到下拉列表?

任何指针都会很棒,

干杯!


修改

相关:How Do I Model Bind A List Of 'List<SelectItem>' Using MVC.Net也在发送密钥值

考虑到Stephen Muecke的回答,我试过了:

        for (int i = 0; i < Model.Options.Count; i++)
        {
            <div class="form-group">
                <label>@Model.Options[i].OptionType</label>
                @Html.HiddenFor(m => Model.Options[i].OptionType)
                @Html.DropDownListFor(m => m.Options[i].SelectedOption, Model.Options[i].Options, Model.Options[i].OptionType, new { @class = "form-control" })
            </div>
        }

但仍然没有运气:(

1 个答案:

答案 0 :(得分:1)

从方法中删除以下内容

.. name = string.Format("model.Options[{0}].SelectedOption", i) ..

@Html.DropDownList()方法会为您正确命名选择,这将是

<select name="Options[0].SelectedOption" ...>
<select name="Options[1].SelectedOption" ...>
// etc

但是你正在使用&#34;模型。&#34;这样,名字就不会与回发相匹配

OptionGroup的属性也缺少访问者

public class OptionGroup
{
  public string OptionType { get; set; } // add get/set
  public IEnumerable<SelectListItem> Options { get; set; }
  public string SelectedOption { get; set; } // add get/set
}