DropDownListFor值字段 - 属性组合标识符

时间:2014-11-28 16:27:19

标签: asp.net-mvc

我目前正在努力解决如何从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的唯一唯一标识符是ParentIdChildId组合。那么检索数据以唯一标识所选项目的最佳方法是什么?

从这些模型对象之一构造唯一标识符将类似于以下(业务逻辑):

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

虽然这可行,但它需要我更改基础表,模型和大量引用代码,所以如果我不必添加这个代理键,那么我宁愿不这样做。

任何想法或想法?提前谢谢!

1 个答案:

答案 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。