【问题标题】:How to create a custom HTML Helper method DropDownFor in ASP.Net MVC如何在 ASP.Net MVC 中创建自定义 HTML Helper 方法 DropDownFor
【发布时间】:2012-06-26 03:01:03
【问题描述】:

我正在尝试创建一个下拉框,当用户无权访问它时,它将在某些条件下呈现标签。

到目前为止,我想出了这个

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,而不是通常显示在下拉列表中的文本.

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

【问题讨论】:

    标签: c# asp.net-mvc lambda html-helper expression-trees


    【解决方案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 字符串中。 (这不像您的辅助方法可以访问任何数据注释等)

    【讨论】:

    • 这行得通,MvcHtmlString 出现小错误,必须使用 .Create,我还将 where 更改为 FirstOrDefault() 否则一切都很好,干杯
    【解决方案2】:

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

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

    尽管在上面的代码中使用它之前,您可能必须先计算表达式。

    【讨论】:

    • 这行不通,因为 expression 是 Expression 类型,而不是字符串。您必须以某种方式解决表达式。
    • 看起来 ExpressionHelper.GetExpressionText 将解析为字符串,但仍然无法编译
    • @dbaseman 有正确的想法。您不需要 DisplayFor,只需生成一个跨度并返回文本即可。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多