Отображение HTML-кода, например & reg или & copy, в тексте Html.ActionLink

К сожалению, мои исследования по этой теме не увенчались успехом. С помощью тега привязки я смог сделать это:

<a href="..."> My Link &reg </a>

Теперь я хочу то же самое с Html.Actionlink:

@Html.ActionLink("My Link &reg", "Action")

Но вывод такой же, как и ввод, а не символ reg, как задумано. Любая идея?

Заранее спасибо!


person LFish    schedule 16.07.2012    source источник


Ответы (4)


ActionLink всегда использует вызов HttpUtility.Encode для текста ссылки.

Вы можете использовать метод UrlHelper, например

<a href="@Url.Action("Action")">My Link &reg</a>
person Yograj Gupta    schedule 16.07.2012

Вы можете использовать HtmlString (MvcHtmlString в .NET 2 / MVC 2), чтобы указать, что вы не хотите его перекодировать:

@Html.ActionLink(new HtmlString("My Link &reg"), "Action");
person Richard Szalay    schedule 16.07.2012
comment
Выглядит правильно, но Html.ActionLink не принимает HtmlString в качестве типа ввода (это должна быть строка, а не HtmlString) - person LFish; 19.07.2012
comment
Черт, хотя создать перегруженный метод расширения, который это делает, не составит труда. - person Richard Szalay; 19.07.2012
comment
Игнорируйте мой предыдущий комментарий. Пошел вперед и реализовал это. См. Мой ответ здесь: stackoverflow.com/a/14488497/1015595 - person Big McLargeHuge; 24.01.2013

Вот как я решил это в MVC 2:

/// <summary>
/// Creates an anchor tag based on the passed in controller type and method.
/// Does NOT encode passed in link text.
/// </summary>
/// <typeparam name="TController">The controller type</typeparam>
/// <param name="htmlHelper">The HTML helper</param>
/// <param name="action">The method to route to</param>
/// <param name="linkText">The linked text to appear on the page</param>
/// <returns>A formatted anchor tag</returns>
public static MvcHtmlString ActionLink<TController>( this HtmlHelper htmlHelper,
                                                     Expression<Action<TController>> action,
                                                     HtmlString linkText ) where TController : Controller
{
    return ActionLink( htmlHelper, action, linkText, null, null );
}

/// <summary>
/// Creates an anchor tag based on the passed in controller type and method.
/// Does NOT encode passed in link text.
/// </summary>
/// <typeparam name="TController">The controller type</typeparam>
/// <param name="htmlHelper">The HTML helper</param>
/// <param name="action">The method to route to</param>
/// <param name="linkText">The linked text to appear on the page</param>
/// <param name="routeValues">The route values</param>
/// <param name="htmlAttributes">The HTML attributes</param>
/// <returns>A formatted anchor tag</returns>
public static MvcHtmlString ActionLink<TController>( this HtmlHelper htmlHelper,
                                                     Expression<Action<TController>> action,
                                                     HtmlString linkText,
                                                     object routeValues,
                                                     object htmlAttributes ) where TController : Controller
{
    var routingValues = GetRouteValuesFromExpression( action, routeValues );

    var url = UrlHelper.GenerateUrl( null, //routeName
                                     null, //actionName
                                     null, //controllerName
                                     routingValues,
                                     htmlHelper.RouteCollection,
                                     htmlHelper.ViewContext.RequestContext,
                                     false ); //includeImplicitMvcValues

    var tagBuilder = new TagBuilder("a")
        { 
            InnerHtml = !String.IsNullOrEmpty( linkText.ToString() ) ? linkText.ToString() : String.Empty
        };

    tagBuilder.MergeAttributes( (IDictionary<string, object>)htmlAttributes );
    tagBuilder.MergeAttribute( "href", url );

    return MvcHtmlString.Create( tagBuilder.ToString( TagRenderMode.Normal ) );
}

Он строго типизирован, как в пакете NuGet фьючерсов MVC. Таким образом, вы можете использовать это так:

<%= Html.ActionLink<HomeController>( x => x.Index(),
                                     new HtmlString( "Don't Encode Me!<sup>&reg;</sup>" ) ) %>
person Big McLargeHuge    schedule 23.01.2013

person    schedule
comment
Вначале я думал то же, что и ваше первое предложение, но разве это не плохой стиль кода, если вы видите в своем коде специальные символы? - person LFish; 19.07.2012