如果我有一个具有以下结构的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的这篇文章:
尝试使用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>
}
但仍然没有运气:(
答案 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
}