2013-02-05 26 views
2

我创建了一个下拉列表定制的helper方法具有以下签名选定的文本:如何从一个的SelectList

public static MvcHtmlString MyCustomDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, object htmlAttributes) 

在这个方法中,我可以执行以下操作来获得所选择的值:

var Value = ((SelectList)selectList).SelectedValue); 

在帮助我的方法,我需要找出选定的文本是什么为好,而不仅仅是值。我将如何获得?

回答

2

如果您已经选择的值就可以通过IEnumerable试图找到所选SelectListItem只是重复:

 SelectListItem[] items = selectList.ToArray(); 
     SelectListItem selectedItem = items.FirstOrDefault(i => i.Value == valueAsString) 
      ?? items[0]; 
     string selectedText = selectedItem.Text; 

从我看来,铸造SelectList是不是最好的选择,以找到选择的值,该铸造当真实类型selectList变量不是SelectList时,可能会抛出InvalidCastException

在大多数情况下,您的模型包含应在下拉列表中选择的值。您可以使用ModelMetadata类如下得到这个值:

 //Get value from model or from ModelState 
     object modelValue = ModelMetadata 
      .FromLambdaExpression(expression, html.ViewData).Model; 

     SelectListItem[] items = selectList.ToArray(); 

     string selectedValue = modelValue == null ? null : modelValue.ToString(); 

     SelectListItem selectedItem = items.FirstOrDefault(i => i.Value == selectedValue) 
      ?? items.FirstOrDefault(); 

     string selectedText = selectedItem == null ? null : selectedItem.Text; 

     //Rest code goes here 
+0

谢谢你的提示和答案! – TK1

1
public static string getText(SelectList selectList) 
    {    
    string text = selectList.Where(x => x.Selected).FirstOrDefault().Text; 
    return text; 
    }