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を見つけようとすることを繰り返すことができます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 に答える