我们最近添加了一个扩展方法(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>";
}
答案 0 :(得分:1)
ActionLink
(并且我想象所有Html
辅助方法)出于明显的安全原因对HTML文本进行HTML编码(默认情况下会阻止XSS漏洞)。
如果您只需要应用CSS类,则可以直接在ActionLink
中执行:
<%= Html.ActionLink(word, action, null, new { @class = "highlighted" })%>
当然,这会将class
应用于a
,而不是使用span
。但是,当span
同时拥有一个类属性时,为什么首先需要在a
内a
?
答案 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) %>