扩展MVC3 razor Html.LabelFor以添加css类

时间:2012-05-15 14:32:43

标签: asp.net-mvc-3 c#-4.0 razor

我正在尝试在EditorTemplate上为Html.LabelFor添加一个css类

 @Html.LabelFor(model => model.Name, new { @class = "myLabel" })

我的期望例如:label应该选择css类。

为此我尝试使用以下代码扩展Label,但我的标签没有显示。 我在这里做错了什么?

 public static class LabelExtensions
    {
        public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
        {
            return html.LabelFor(expression, null, htmlAttributes);
        }

        public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText, object htmlAttributes)
        {
            return html.LabelHelper(
                ModelMetadata.FromLambdaExpression(expression, html.ViewData),
                ExpressionHelper.GetExpressionText(expression),
                HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes),
                labelText);
        }

        private static MvcHtmlString LabelHelper(this HtmlHelper html, ModelMetadata metadata, string htmlFieldName, IDictionary<string, object> htmlAttributes, string labelText = null)
        {
            var str = labelText
                ?? (metadata.DisplayName
                ?? (metadata.PropertyName
                ?? htmlFieldName.Split(new[] { '.' }).Last()));

            if (string.IsNullOrEmpty(str))
                return MvcHtmlString.Empty;

            var tagBuilder = new TagBuilder("label");
            tagBuilder.MergeAttributes(htmlAttributes);
            tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
            tagBuilder.SetInnerText(str);

            return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);
        }

        private static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode)
        {
            return new MvcHtmlString(tagBuilder.ToString(renderMode));
        }
    }

如果我没有指定例如@Html.LabelFor(model => model.Name)的css类,那么它会显示标签。 但我无法将css应用于我的标签。 我希望在页面加载时以蓝色显示标签。然后使用jquey更改基于用户操作的标签样式。在我的页面上很好,除了我无法扩展并添加css类这一事实到我的标签。

2 个答案:

答案 0 :(得分:16)

我怀疑您忘记了在视图中将此LabelExtensions类定义在其范围内的命名空间。因此,例如,如果在MyProject.Extensions命名空间中定义了此类:

namespace MyProject.Extensions
{
    public static class LabelExtensions
    {
        ...
    }
}

确保您已将此命名空间纳入范围:

@using MyProject.Extensions
@model MyViewModel
...
@Html.LabelFor(model => model.Name, new { @class = "myLabel" })

答案 1 :(得分:0)

您正在使用html.LabelHelper

但是您已经定义了自己的LabelHelper方法,因此请使用它=)