Skończyło się na niestandardowej metodzie rozszerzenia. Warto zauważyć, że podczas próby umieszczenia kodu HTML wewnątrz obiektu Anchor tekst linku może znajdować się po lewej lub po prawej stronie wewnętrznego kodu HTML. Z tego powodu zdecydowałem się podać parametry dla lewego i prawego wewnętrznego kodu HTML - tekst linku znajduje się pośrodku. Zarówno lewy, jak i prawy wewnętrzny kod HTML są opcjonalne.
Metoda rozszerzenia ActionLinkInnerHtml:
public static MvcHtmlString ActionLinkInnerHtml(this HtmlHelper helper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues = null, IDictionary<string, object> htmlAttributes = null, string leftInnerHtml = null, string rightInnerHtml = null)
{
// CONSTRUCT THE URL
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
var url = urlHelper.Action(actionName: actionName, controllerName: controllerName, routeValues: routeValues);
// CREATE AN ANCHOR TAG BUILDER
var builder = new TagBuilder("a");
builder.InnerHtml = string.Format("{0}{1}{2}", leftInnerHtml, linkText, rightInnerHtml);
builder.MergeAttribute(key: "href", value: url);
// ADD HTML ATTRIBUTES
builder.MergeAttributes(htmlAttributes, replaceExisting: true);
// BUILD THE STRING AND RETURN IT
var mvcHtmlString = MvcHtmlString.Create(builder.ToString());
return mvcHtmlString;
}
Przykład użycia:
Oto przykład użycia. W tym przykładzie chciałem, aby wewnętrzny kod HTML znajdował się po prawej stronie tekstu linku ...
@Html.ActionLinkInnerHtml(
linkText: "Hello World"
, actionName: "SomethingOtherThanIndex"
, controllerName: "SomethingOtherThanHome"
, rightInnerHtml: "<span class=\"caret\" />"
)
Wyniki:
skutkuje to następującym kodem HTML ...
<a href="/SomethingOtherThanHome/SomethingOtherThanIndex">Hello World<span class="caret" /></a>