我使用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
值类型吗?
答案 0 :(得分:2)
new SelectList(Entities.Instance.Partners.Select(o => new { Id = o.Id, Name = o.Name }).ToList(), "Id", "Name");
答案 1 :(得分:2)
一些事情:
Dictionary<int, string>
GetParents
。在控制器的操作方法中执行此操作,然后将列表传递到视图代码深处的某些地方:
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周期贵得多。担心实施而不是性能。