ASP.NET Mvc获取List <selectlistitem>来自EntityContext?</selectlistitem>的最佳方法

时间:2013-08-07 15:18:06

标签: c# asp.net-mvc

我使用EntityFramework作为Dataaccess在asp.net mvc Webapplication中查看我的Enduser的DropDownList。

实现这一目标并不是一件难事,但我有点努力寻找一个好看的方式。

但首先是一些代码:

<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中不适用于实体......

仍然有像SqlFunctions.Tostring((double)x.ID)这样的东西,这不是完美的解决方案,但是很好。 至少直到我看到它将Id 4改为string这样:“* lotsofspaces * 4”并且修剪每个值太多,不能被认为是对我很好的解决方案。

最美丽的代码解决方案是:

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

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

所以我的问题:你能告诉我一个干净,漂亮的方式从Dropty中的EntityFrame获取我的数据,而我的valueField是int值类型吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

一些事情:

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

    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...")
    

答案 2 :(得分:1)

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

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

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