2

我正在为具有以下签名的下拉列表创建自定义帮助器方法:

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);

在我的辅助方法中,我还需要找出所选文本是什么,而不仅仅是值。我将如何得到它?

4

2 回答 2

3

如果您已经选择了值,则可以遍历IEnumerable尝试查找 selected SelectListItem

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

在我看来,转换SelectList为不是找到选定值的最佳选择,InvalidCastException当变量的真实类型selectList不是SelectList.

在大多数情况下,您的模型包含一个应在下拉列表中选择的值。您可以使用以下类获取此值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
于 2013-02-05T18:39:51.527 回答
3
  public static string getText(SelectList selectList)
  {            
    string text =  selectList.Where(x => x.Selected).FirstOrDefault().Text;
    return text; 
  }
于 2017-02-07T00:31:06.343 回答