我目前正在努力解决如何从HtmlHelper.DropDownListFor
对象中确定所选数据的问题。问题是模型类没有单一属性能够唯一地识别模型。
下面是我的模型和视图模型类,以及视图中HtmlHelper.DropDownListFor
调用的示例。
public class MyModel
{
public int ParentId { get; set; } // combined with ChildId is the unique identifier
public int ChildId { get; set; } // see above
public string Name { get; set; } // not unique
}
public class MyViewModel
{
public IEnumerable<MyModel> MyModels { get; set; }
public <???> SelectedItem { get; set; }
}
@Html.DropDownListFor(m => m.SelectedItem, new SelectList(Model.MyModels, "DataValueField", "Name"))
这里的问题是MyModel
的唯一唯一标识符是ParentId
和ChildId
的组合。那么检索数据以唯一标识所选项目的最佳方法是什么?
从这些模型对象之一构造唯一标识符将类似于以下(业务逻辑):
ModelUniqueIdentifier = ParentId * 100 + ChildId
但我没有看到任何方法来强制执行此逻辑以将MyViewModel.SelectedItem
设置为此。
当从提交表单的任何触发器回发时,我希望能够从模型的SelectedItem
属性中获取所选值,以便进行其他处理。但是对于一维"DataValueField"
,我不确定实现这一目标的最佳方法。
避免这种情况最明显的方法是将代理键作为单例标识符注入数据中。但是有了这个特殊的数据,这个明显的复合自然键在这一点上做得很好。
所以二维数据看起来像:
ParentId ChildId Name
7 3 Name1
4 8 Name2
5 3 Name3
4 6 Name4
如果我要为数据添加代理键,它就可以完成这项任务:
SurrogateId ParentId ChildId Name
0 7 3 Name1
1 4 8 Name2
2 5 3 Name3
3 4 6 Name4
虽然这可行,但它需要我更改基础表,模型和大量引用代码,所以如果我不必添加这个代理键,那么我宁愿不这样做。
任何想法或想法?提前谢谢!
答案 0 :(得分:1)
您可以尝试在模型中使用计算的get属性,该属性会在调用时生成您的唯一ID。然后通过&#39; UniqueId&#39;作为选择列表/下拉列表的数据值字段。 E.g。
public class MyModel
{
public int UniqueId {
get {
return ParentId * 100 + ChildId;
}
}
public int ParentId { get; set; } // combined with ChildId is the unique identifier
public int ChildId { get; set; } // see above
public string Name { get; set; } // not unique
}
在这种情况下,SelectItem将是一个int。