1

ユーザーがラベルにアクセスできない場合に、特定の条件下でラベルをレンダリングするドロップダウンボックスを作成しようとしています。

これまで私はこれを思いついた

public static MvcHtmlString ReadOnlyCapableDropDownFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, 
        IEnumerable<SelectListItem> selectList, 
        bool enabled, 
        object htmlAttributes
)
{
     return !enabled ? htmlHelper.DisplayFor(expression)
          : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
}

これにより、有効になっている場合はラベルが正しくレンダリングされ、trueの場合はドロップダウンが表示されます。問題は、ラベルのテキストが、ドロップダウンに通常表示されるテキストではなく、選択した選択リスト値のIDであるということです。

の表示の値に式を使用しているので、これは理にかなっています。この式を使用して、データ値ではなく選択リストアイテムのテキスト値を取得するにはどうすればよいですか?

4

2 に答える 2

1

テキスト値を自分で調べる必要があります。選択リストが利用可能であるため、このルーチンでそれを実行できるはずです。

? htmlHelper.DisplayFor(selectList.Single(x=>x.Value == expression).Text

ただし、上記のコードで使用する前に式を評価する必要がある場合があります。

于 2012-06-26T03:22:59.573 に答える
1

式をコンパイルして、モデルから値を取得できます。次に、selectListから正しいテキストを選択します。

TProperty val = expression.Compile().Invoke(htmlHelper.ViewData.Model);
SelectListItem selectedItem = selectList.Where(item => item.Value == Convert.ToString(val)).FirstOrDefault();
string text = "";
if (selectedItem != null) text = selectedItem.Text;

return !enabled ? new MvcHtmlString("<span>" + text + "</span>")
      : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);

この場合、アドホックMvcHtmlStringを返すだけで十分だと思います。とにかく、すべての情報がそのselectList文字列に含まれているからです。(ヘルパーメソッドがデータアノテーションなどにアクセスできるわけではありません)

于 2012-06-26T03:48:22.617 に答える