我正在尝试将具有两个属性的模型(一个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的字段,所以如果这有任何区别......
答案 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)