将类应用于某些链接文本

时间:2012-08-13 16:57:19

标签: c# asp.net-mvc-2 html.actionlink

我们最近添加了一个扩展方法(string.Highlight(string target)),用<span class="highlighted"></span>包装目标文本的出现,并将其用于页面上显示的所有文本。

我们遇到的最初问题是,文本不是包含在标记中,而是以明文"<span clas..."包装。除了链接中的文本外,我们已设法解决此问题。

<%= Html.ActionLink(linkText.Highlight(word), action) %>

这会将文字"<span class..."粘贴到链接中,这不是我们想要的。有没有办法将我们的突出显示类应用于链接中的某些文本,还是应该忘记它?


扩展方法:

public static string Highlight(this string text, this string target)
{
    return text.Replace(target, @"<span class=""highlighted"">" + target + "</span>";
}

2 个答案:

答案 0 :(得分:1)

ActionLink(并且我想象所有Html辅助方法)出于明显的安全原因对HTML文本进行HTML编码(默认情况下会阻止XSS漏洞)。

如果您只需要应用CSS类,则可以直接在ActionLink中执行:

<%= Html.ActionLink(word, action, null, new { @class = "highlighted" })%>

当然,这会将class应用于a,而不是使用span。但是,当span同时拥有一个类属性时,为什么首先需要在aa

答案 1 :(得分:1)

您可以编写一个自定义的ActionLink扩展方法,该方法不会像标准帮助程序那样对文本进行HTML编码:

public static MvcHtmlString UnencodedActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName
)
{
    var str = UrlHelper.GenerateUrl(null, actionName, null, null, null, null, new RouteValueDictionary(), htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true);
    var a = new TagBuilder("a")
    {
        InnerHtml = !string.IsNullOrEmpty(linkText) ? linkText : string.Empty
    };
    a.MergeAttribute("href", str);
    return MvcHtmlString.Create(a.ToString(TagRenderMode.Normal));
}

然后:

<%= Html.UnencodedActionLink(linkText.Highlight(word), action) %>

甚至更好:

public static MvcHtmlString HighlightedActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string word,
    string actionName
)
{
    var str = UrlHelper.GenerateUrl(null, actionName, null, null, null, null, new RouteValueDictionary(), htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true);
    var a = new TagBuilder("a")
    {
        InnerHtml = !string.IsNullOrEmpty(linkText) ? linkText.Highlight(word) : string.Empty
    };
    a.MergeAttribute("href", str);
    return MvcHtmlString.Create(a.ToString(TagRenderMode.Normal));
}

然后:

<%= Html.HighlightedActionLink(linkText, word, action) %>