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

Binding a complex model to a drop down list in MVC

本文关键字:绑定 模型 MVC 下拉列表 复杂 一个      更新时间:2023-09-26

我试图绑定一个模型,有两个属性-一个Int,一个布尔-到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; }
}

目的是为视图提供一组模型,然后用户可以从中选择一个。不幸的是,每个模型都有两个属性,用于标识在数据库中选择了哪个模型——Id(它反映了数据库中的Id)和Discriminator。否则这两种类型在数据库中是不兼容的,因此使用了鉴别符。出于设计的考虑,我只希望将这两个放在同一个下拉列表中,因为无论如何您一次只能选择一个。

我的解决方案是创建两个隐藏字段,它们将像这样绑定到模型

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

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

还有其他选择吗?

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

选择框只能发布一个内容,而使用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)