web-dev-qa-db-ja.com

リンクテキストにHTML要素を含むActionLinkを作成する

ASP.NET MVCビューに、次の形式のリンクを含めたいです。

_<a href="blah">Link text <span>with further descriptive text</span></a>
_

Html.ActionLink()の呼び出しのlinkTextフィールドに_<span>_要素を含めようとすると、(予想どおり)エンコードされます。

これを達成するための推奨される方法はありますか?

34
Giraffe

Url.Actionを使用してリンクを作成できます。

<a href="<% =Url.Action("Action", "Controller")%>">link text <span>with further blablah</span></a>

または、Html.BuildUrlFromExpressionを使用します。

<a href="<% =Html.BuildUrlFromExpression<Controller>(c => c.Action()) %>">text <span>text</span></a>
52
Casper

razorを使用する場合は、これでうまくいくはずです。

<a href="@Url.Action("Action", "Controller")">link text <span>with further blablah</span></a>
41
dplante

別のオプションは、HTML.ActionLinkまたはAjax.ActionLink(コンテキストに応じて)を使用して、通常どおりにMvcHtmlStringへのアクションリンクをレンダリングし、レンダリングされたMvcHtmlStringを受け取り、htmlリンクテキストを直接ハックするクラスを記述します。既にMvcHtmlStringをレンダリングし、別のMvcHtmlStringを返します。

したがって、これは次のことを行うクラスです。

namespace Bonk.Framework
{
    public class CustomHTML
    {
        static public MvcHtmlString AddLinkText(MvcHtmlString htmlString, string linkText)
        {
            string raw = htmlString.ToString();

            string left = raw.Substring(0, raw.IndexOf(">") + 1);
            string right = raw.Substring(raw.LastIndexOf("<"));

            string composed = left + linkText + right;

            return new MvcHtmlString(composed);
        }
    }
}

そして、次のようなビューで使用します。

@Bonk.Framework.CustomHTML.AddLinkText(Ajax.ActionLink("text to be replaced", "DeleteNotificationCorporateRecipient"), @"Link text <span>with further descriptive text</span>")

このアプローチには、タグのレンダリングプロセスを再現または理解する必要がないという利点があります。

0