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

这会在启用为 false 时正确呈现标签,而在为 true 时呈现下拉列表,问题是标签的文本是所选选择列表值的 id,而不是通常显示在下拉列表中的文本。

这是有道理的,因为我将表达式用于显示的值,如何使用此表达式来获取选择列表项文本值而不是数据值?

4

2 回答 2

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 回答
1

您需要自己查找文本值。您应该能够在此例程中执行此操作,因为您有可用的选择列表:

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

尽管您可能必须在上面的代码中使用它之前评估表达式。

于 2012-06-26T03:22:59.573 回答