2

我正在使用 EntityFramework 作为数据访问,以在 asp.net mvc Web 应用程序中向我的最终用户查看国家的下拉列表。

实现这一目标并不难,但我很难找到一个好看的方法。

但首先是一些代码:

<td>
     @Html.DropDownListFor(x => x.ParentId, repos.GetParents(@Model.ParentId)
</td>

在真实代码深处的某个地方:

class dummy
    {
        public string Text { get; set; }
        public int Value { get; set; }
    }

    private SelectList _parents;
    public SelectList Parents
    {
        get
        {
            if (_parents == null)
            {
                var parents = Entities.Instance.Partners.Select(x => new dummy() { Text = x.Name, Value = x.Id }).OrderBy(x => x.Text).ToList();
                parents.Insert(0, new dummy());

                _parents = new SelectList(parents, "Value", "Text");
            }
            return _parents;
        }
    }

    public SelectList GetParents(int? parentId)
    {
        if (parentId != 0 && parentId.HasValue)
        {
            //setSelected
        }
        return Parents;
    }

如您所见,我创建了一个* * 虚拟类仅用于复制数据!为什么?因为x.Id.ToString或等效方法在 linq to entity 中不起作用...

仍然有这样的东西SqlFunctions.Tostring((double)x.ID)不是完美的解决方案,但很好。至少在我看到它使 Id 4 变成string这样之前:“*lotsofspaces*4”和修剪每个值对于我来说太多了,不能被视为一个好的解决方案。

最漂亮的代码解决方案是这样的:

new SelectList(Entities.Instance.Partners, "Id", "Name");

美不美?:) 不,这不对!因为它从合作伙伴中选择整个数据 - 不仅是 ID 和名称列。

int所以我的问题是:当我的 valueField 是一个valuetype时,你能告诉我一种从 EntityFrame 中的下拉列表中获取我的数据的干净且好看的方法吗?

4

3 回答 3

2
new SelectList(Entities.Instance.Partners.Select(o => new { Id = o.Id, Name = o.Name }).ToList(), "Id", "Name");
于 2013-08-07T15:44:12.010 回答
2

几件事:

  1. 您不需要创建虚拟类。只需使用Dictionary<int, string>
  2. 不要GetParents从视图中调用。在控制器的 action 方法中执行此操作,然后将列表传递到视图中
  3. 您不需要将空项目插入到列表中。DropDownList HTML 帮助器有一个重载,它接收一个空项目的文本以设置为第一个选项。在下面的代码中,它将显示“选择...”,但您可以简单地提供一个空字符串。

一些在你的代码深处:

public Dictionary<int, string> GetItems(int parentId)
{
    return (from partner in Entities.Instance.Partners
               order by partner.Text
              select partner).ToDictionary(x => x.Id, v => v.Name);

}

控制器:

public ActionMethod MyPage(int parentId)
{
    var myView = new MyViewModel();
    myView.Items = _service.GetItems(parentId);
}

看法:

@Html.DropDownList("parentId", new SelectList(Model.Items, "Key", "Value"), "Select...")
于 2013-08-07T15:45:12.757 回答
1

你基本上可以做同样的事情,只是你可以使用匿名类型而不是 delaring 和使用“dumy”:

new SelectList(Entities
    .Instance
    .Partners
    .Select(e => new 
    {
        Id = e.Id,
        Name = e.Name,
    }), "Id", "Name");

当然,您仍然会从可能成为“数据层”的地方公开 SelectList,这比选择一些额外的列来填充下拉列表要糟糕得多。请记住,您作为开发人员的时间比几个 IO/Cpu 周期要昂贵得多。更多地担心实施而不是性能。

于 2013-08-07T15:46:27.350 回答