在HTML Helper

时间:2015-08-21 11:18:39

标签: c# asp.net-mvc razor

我有一个几乎完整的解决方案,但我陷入了最后的障碍!

这是我的DropDownList助手

    // DropDown helper
    public static MvcHtmlString DropDownInputFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> ListValues, string DefaultText, object HTMLAttributes, bool CanEdit)
    {
        if (CanEdit == true)
        {
            // return a dropdown
            return htmlHelper.DropDownListFor(expression, ListValues, DefaultText, HTMLAttributes);
        }
        else
        {
            // just return the text (no editor)                
            return htmlHelper.DisplayFor(expression);
        }
    }

正如您所看到的,我将根据用户是否可以编辑来返回帮助程序。在这种情况下,如果他们可以编辑,那么我们返回DropDownList,如果他们无法编辑,我们只返回DisplayFor。

然而,问题在于DisplayFor显示'value'(外键)而不是DropDown的文本。

有关如何显示文字而不是值的任何建议?

1 个答案:

答案 0 :(得分:0)

据我所知,如果CanEdit为false,您只需要显示与ListValues中的值相对应的文本。为此你可以尝试类似的东西:

// DropDown helper
        public static MvcHtmlString DropDownInputFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> ListValues, string DefaultText, object HTMLAttributes, bool CanEdit)
        {            
            if (CanEdit == true)
            {
                // return a dropdown
                return htmlHelper.DropDownListFor(expression, ListValues, DefaultText, HTMLAttributes);
            }
            else
            {
                // just return the text (no editor) 
                //but first make sure you have a valid value in your list and show it               
                var selected = ListValues.FirstOrDefault(item => item.Selected == true);
                if (selected != null)
                    return htmlHelper.DisplayName(selected.Text);
                else
                    //here you can just put the default selected item if no valid value is found
                    return htmlHelper.DisplayName(ExpressionHelper.GetExpressionText(expression));//or whatever defaultvalue you want 
            }
        }

问题是文本包含在ListValues中,并且所选项目应与您的表达式值匹配。