将复杂模型绑定到MVC中的下拉列表

时间:2014-08-14 14:02:18

标签: c# javascript asp.net-mvc

我正在尝试将具有两个属性的模型(一个Int和一个Boolean)绑定到MVC中的下拉列表。布尔值是鉴别器,整数是ID。无法将下拉列表拆分为两个。

到目前为止,这是我的代码。

<select class="col-md-3 form-control" name="Model.ID" id="model-select">
    <option value="0" selected>Select an Option</option>
    @foreach (var m in models.OrderBy(x => x.Id))
    {
        <option value="@m.ID" data-discriminator="@m.Discriminator">
            @m.Name
        </option>
    }
</select>

该模型看起来像这样

class MyModel
{
  int ID { get; set; }
  string Name { get; set; }
  boolean Discriminator { get; set; }
}

目的是为View提供一组模型,然后用户可以选择其中一个。不幸的是,每个模型都有两个属性,用于标识在数据库中选择的模型 - Id,它反映了数据库中的Id,以及Discriminator。这两种类型在数据库中是不兼容的,因此是鉴别器。为了设计起见,我只希望将这两个放在同一个下拉列表中,因为你一次只能选择一个。

我对解决方案的想法是创建2个隐藏字段,这些字段将绑定到模型,如此

<input type="hidden" name="Model.ID" />
<input type="hidden" name="Model.Discriminator" />

这些将通过JavaScript更新,然后绑定到模型(据我所知,使用这样的名称将正确绑定它,前提是传递给POST的模型上的目标属性是本例中的模型)。

我还有其他选择吗?

编辑:另外值得注意的是,这个'模型'是更复杂模型的一部分,并不是唯一被POST的字段,所以如果这有任何区别......

1 个答案:

答案 0 :(得分:0)

选择框只能发布一个东西,并且使用JavaScript来填充隐藏字段,虽然可能是一个可行的解决方案,但看起来非常脆弱。您最好的选择是创建一个中间属性,您可以将其绑定到并包含两组信息作为选项值:

public string SelectedThing
{
    get { return string.Format("{0},{1}", ID, Discriminator); }
    set
    {
        if (value != null)
        {
            var parts = value.Split(',');
            if (parts.Length == 2)
            {
                Int32.TryParse(parts[0], out ID);
                Boolean.TryParse(parts[1], out Discriminator);
            }
        }
    }
}

然后你需要以类似的方式撰写你的选择列表:

ViewBag.MyModelChoices = myModels.Select(m => new SelectListItem
    {
        Value = string.Format("{0},{1}", m.ID, m.Discriminator),
        Text = m.Name
    });

最后,您将在视图中绑定到这个新属性:

@Html.DropDownListFor(m => m.SelectedThing, ViewBag.MyModelChoices)