2010-08-19 65 views
2

所以我得到了这个疯狂的想法,我可以做出一些很酷的工作。我厌倦了新的选择列表的(项目,“嗒嗒”,“blahblah”),所以我开始写一个扩展方法(试图让它更强类型)这样的事情...SelectList扩展 - 夫妻表达式

var selectList = projects.ToSelectList(p =>p.ProjectID, p =>p.ProjectName); 

扩展方法去有点像这样

public static SelectList ToSelectList<T>(this IEnumerable<T> item, 
          Expression<Func<T, string>> textName, 
          Expression<Func<T, string>> valueProperty) 
    { 
     //do cool stuff 
     return new SelectList(items, dataTextField, dataValueField); 
    } 

我需要的是反射属性,所以我可以获取值并获取名称。任何想法我怎么能做到这一点?任何想法做得更好/更容易?我之前做过这件事,但对于我的生活,我不记得我是如何做到的。

编辑这需要一些解释。我复制了一些正在运行但未完善的代码,因此我更新了代码以反映更正确的标准。

回答

5

我不明白为什么你必须使用反射来做到这一点。

public static SelectList ToSelectListItem<T>(this IEnumerable<T> items, 
    Func<T, string> textName, Func<T, string> valueProperty) { 
    { 
    return new SelectList(items 
      .Select(i => new SelectListItem {Text = textName(i), Value = valueProperty(i)})); 
    } 
} 

应该会工作,但我没有在当前机器上的MVC dll。

0

我最初尝试了你的想法,当我开始使用MVC,但后来我意识到,我想以某种方式格式化一些字段,以及什么时候应默认选择某个项目。处理了所有这些之后,我意识到只写一行LAMDA表达式会更清楚。

所以现在我通常只是做一个LAMDA表达式来生成我的SelectListItem集合。

<b>Screener: </b><%= Html.DropDownList("ScreenerOI", Model.Screeners.Select(p=>new SelectListItem() { Text = p.firstName + " " + p.lastName, Value = p.OI.ToString() })) %> 

<b>Open Time: </b> 
       <%= Html.DropDownListFor(c => c.OpenTime, Model.HoursInDay.Select(p => new SelectListItem() { Text = p != null ? DateTime.Now.Date.Add(p.Value).ToString("h:mm tt") : "Clear Time", Value = p != null ? p.ToString() : "", Selected = Model.OpenTime == p }).ToList())%> 

看起来这似乎就像您的想法是什么一样清晰。

另一个例子

<b>Screener Status: </b> 
       <%= Html.DropDownListFor(c => c.InfoStatusOI, Model.InfoStatuses.Select(p => new SelectListItem() { Text = p != null ? p.Status.ToString() : "", Value = p != null ? p.OI.ToString() : "", Selected = p != null && Model.InfoStatusOI == p.OI }).ToList())%> 
0

这需要清洗,搞什么项目的零计数测试,但这里的最终结果。

public static SelectList ToSelectList<T>(this IEnumerable<T> items, Expression<Func<T, object >> textName, Expression<Func<T, object >> valueProperty) 
     { 
      var dataTextField = textName.Body.ToString().Split('.')[1]; 
      var dataValueField = valueProperty.Body.ToString().Split('.')[1]; 
      return new SelectList(items, dataTextField, dataValueField); 
     }