Asp.net mvc 如何在MVC5中更改自定义Html标记中标记的颜色

Asp.net mvc 如何在MVC5中更改自定义Html标记中标记的颜色,asp.net-mvc,html-helper,Asp.net Mvc,Html Helper,我有一个自定义的html助手类,如下所示 public static class LabelWithAstrickHelper { public static MvcHtmlString LabelWithAstrick<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttribute

我有一个自定义的html助手类,如下所示

public static class LabelWithAstrickHelper
{
    public static MvcHtmlString LabelWithAstrick<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        string resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName;
        if (metadata.IsRequired)
        {
            resolvedLabelText += "*";
            // resolvedLabelText += "<span style='color:red;'>*</span>";
        }
        return LabelExtensions.LabelFor<TModel, TValue>(html, expression, resolvedLabelText, htmlAttributes);
    }
}
现在,这将显示黑色的“阿斯特里克”,但我想显示红色的“阿斯特里克”标志


请建议如何执行此操作。

由于您希望以不同的方式设置标签文本和关联星号的样式,因此不能使用内置的
LabelFor()
方法(
HtmlHelper
方法对标签文本的值进行编码

相反,您需要在方法中生成自己的html

public static MvcHtmlString LabelWithAstrick<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var name = ExpressionHelper.GetExpressionText(expression);
    string text = metadata.DisplayName ?? metadata.PropertyName ?? name.Split('.').Last();
    // Build 2 span elements containing text and the styled asterisk
    StringBuilder innerHtml = new StringBuilder();
    TagBuilder span = new TagBuilder("span");
    span.InnerHtml = text;
    innerHtml.Append(span.ToString());
    if (metadata.IsRequired)
    {
        span = new TagBuilder("span");
        span.InnerHtml = "*";
        span.MergeAttribute("style", "color:red;"); // see notes
        innerHtml.Append(span.ToString());
    }
    // Create the label element and add the 2 span elements
    TagBuilder label = new TagBuilder("label");
    label.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name)));
    RouteValueDictionary attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    label.MergeAttributes(attributes, replaceExisting: true);
    label.InnerHtml = innerHtml.ToString();
    return new MvcHtmlString(label.ToString());
}
public static MvcHtmlString LabelWithAstrick(此HtmlHelper html、表达式、对象htmlAttributes)
{
var metadata=modelmetada.FromLambdaExpression(表达式,html.ViewData);
var name=ExpressionHelper.GetExpressionText(表达式);
string text=metadata.DisplayName??metadata.PropertyName??name.Split('.').Last();
//构建2个包含文本和带样式的星号的span元素
StringBuilder innerHtml=新的StringBuilder();
标记生成器span=新标记生成器(“span”);
span.InnerHtml=文本;
Append(span.ToString());
if(metadata.IsRequired)
{
span=新标记生成器(“span”);
span.InnerHtml=“*”;
span.MergeAttribute(“样式”,“颜色:红色;”;//参见注释
Append(span.ToString());
}
//创建标签元素并添加两个跨度元素
标记生成器标签=新标记生成器(“标签”);
label.Attributes.Add(“for”,TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name));
RouteValueDictionary attributes=HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
label.MergeAttributes(attributes,replaceExisting:true);
label.InnerHtml=InnerHtml.ToString();
返回新的MvcHtmlString(label.ToString());
}

请注意,我根据您的代码硬编码了星号的内联样式,但是我建议您使用类名,而不是使用
span.AddCssClass(“…”);
,并为该类名创建css定义,以提供更大的灵活性。

是否希望星号为红色,而文本为黑色?(如果需要在
中创建两个独立的
元素,并设置
星号的样式,因为
颜色:红色
是CSS选择器的一部分,请尝试创建包含该选择器的CSS,并将其用作
span
标记中的
htmlAttributes
(使用内置的
标记生成器
方法)@Stephen Muecke:是的,我想用红色显示星号,用黑色标记文本。你能编辑我的代码或显示一些代码片段来实现这一点吗?谢谢。非常感谢..你是国王:)
public static MvcHtmlString LabelWithAstrick<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var name = ExpressionHelper.GetExpressionText(expression);
    string text = metadata.DisplayName ?? metadata.PropertyName ?? name.Split('.').Last();
    // Build 2 span elements containing text and the styled asterisk
    StringBuilder innerHtml = new StringBuilder();
    TagBuilder span = new TagBuilder("span");
    span.InnerHtml = text;
    innerHtml.Append(span.ToString());
    if (metadata.IsRequired)
    {
        span = new TagBuilder("span");
        span.InnerHtml = "*";
        span.MergeAttribute("style", "color:red;"); // see notes
        innerHtml.Append(span.ToString());
    }
    // Create the label element and add the 2 span elements
    TagBuilder label = new TagBuilder("label");
    label.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name)));
    RouteValueDictionary attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    label.MergeAttributes(attributes, replaceExisting: true);
    label.InnerHtml = innerHtml.ToString();
    return new MvcHtmlString(label.ToString());
}