2013-02-05 30 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; 
    }