2012-08-13 42 views
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>"; 
} 
+0

將源文件加入你的擴展方法請 – n8wrl 2012-08-13 16:59:28

+0

不幸的是'ActionLink'總是對文本進行編碼,如果你不想發生這種情況,你可以爲它寫一個擴展名:http://stackoverflow.com/questions/6063467/ raw-actionlink-linktext – Matthew 2012-08-13 17:01:32

回答

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) %> 
1

ActionLink(和我想象的所有Html輔助方法)的HTML編碼明顯的安全原因(防止XSS漏洞默認情況下)的文本。

如果你需要做的是應用CSS類,你可以直接在ActionLink做到這一點:

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

當然,這將適用於classa,而不是使用span。但是,當a也可以擁有類屬性時,爲什麼您首先需要a中的span

+0

這裏的目標是將該類應用於鏈接文本的一部分,而不是全部鏈接。 – yoozer8 2012-08-13 17:09:12

相關問題