将DropDownListFor帮助绑定到字典

时间:2011-10-04 19:48:50

标签: asp.net-mvc

我正在创建并填充一个Dictionary,并希望使用DropDownListFor辅助方法将其绑定到下拉列表。

如何将该词典的keyvalue映射到下拉列表?

看起来我应该可以做类似的事情:

@Html.DropDownListFor(o => o.key, o => o.value, MyDictionary);

似乎第一个参数应该是映射键/值对的LINQ语句,第二个参数是字典本身。

3 个答案:

答案 0 :(得分:10)

您无法将下拉列表绑定到字典。这没有意义。为了生成下拉列表,您需要两件事:一个用于绑定所选值的标量属性和一个用于绑定下拉列表选项的集合。你只有这两件事中的第二件就是字典。所以你不能使用强类型帮助器。

你可以做到以下丑陋:

@Html.DropDownList("SelectedValue", new SelectList(MyDictionary, "Key", "Value"))

但当然更好的方法是使用视图模型:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public SelectList Values { get; set; }
}

您将在控制器操作中填充:

public ActionResult Foo()
{
    Dictionary<string, string> dic = ...
    var model = new MyViewModel
    {
        Values = new SelectList(dic, "Key", "Value")
    };
    return View(model);
}

最后在你的强类型视图中:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedValue, Model.Values)

答案 1 :(得分:1)

您应该尝试这样:

在控制器

ViewBag.hour = new SelectList(Hours.Values);

void AddHours()
{
    Hours = new Dictionary<int, string>();
    Hours.Add(00, "00");
    Hours.Add(01, "01");
    Hours.Add(02, "02");
}

观看

<div  class="col-md-2">
    @Html.DropDownList("Hours", new SelectList(ViewBag.hour.Items), "Hours", htmlAttributes: new { @class = "form-control", placeholder = "Hours" })
</div>

答案 2 :(得分:0)

我喜欢你的回答达林。谢谢,它帮助我提出了这个解决方案。到目前为止,我只用字符串试了一下,但效果很好。以下只是一个简单的例子。我还有扩展方法(这里没有显示),用于从Schema Model对象(对于HttpGets)构建View Model对象,以及从View Model对象构建Schema Model Objects(对于HttpPosts)。

查看模型

public class Step4ViewModel
{
    public SelectList HowToBeContactedOptions { get; set; }

    public string HowToBeContacted { get; set; }
}

扩展方法,使事情更简单,更清洁

public static class EntityExtensionMethods
{
    public static Step4ViewModel PopulateDropDowns(this Step4ViewModel vm)
    {
        var howToBeContactedOptions = new Dictionary<string, string>
        {
            {"Email", "Email"}, 
            {"US Mail", "US Mail"}
        };

        vm.HowToBeContactedOptions = new SelectList(howToBeContactedOptions, "Key", "Value", vm.HowToBeContacted);
}

<强>控制器

[HttpPost]
public ActionResult Step4(Step4ViewModel vm)
{
    if (!ModelState.IsValid)
    {
        return View(vm.PopulateDropDowns());
    }
}

查看

@Html.ValidationSummary()
<table class="table table-bordered table-striped">
    <tr>
        <td>
            @Html.LabelFor(x => x.HowToBeContacted)
        </td>
        <td>
            @Html.DropDownListFor(x => x.HowToBeContacted, Model.HowToBeContactedOptions)
            @Html.ValidationMessageFor(x => x.HowToBeContacted)
        </td>
    </tr>
</table>