0

最近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>";
}
4

2 に答える 2

1

ActionLink(そして私はすべてのヘルパーメソッドを想像しHtmlます)明らかなセキュリティ上の理由でテキストをHTMLエンコードします(デフォルトでXSSの脆弱性を防ぎます)。

CSSクラスを適用するだけの場合は、ActionLink:で直接実行できます。

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

もちろん、これはを使用するのでclassaなく、に適用されますspan。しかし、クラス属性も保持できるのに、そもそもなぜspan内部が必要なのですか?aa

于 2012-08-13T17:06:39.973 に答える
1

標準のヘルパーのようにテキストをHTMLエンコードしないカスタムActionLink拡張メソッドを作成できます。

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) %>
于 2012-08-13T17:22:26.660 に答える