Интегрировать <i> в Html.Actionlink

Как я могу интегрировать приведенный ниже код

<a href="#" class="btn btn-primary"><i class="icon-plus"></i>Add</a>

в

@Html.ActionLink("Add", "xx", "Law", new { _lawfileid = -1, baseappid = ((ObjectModelLibrary.Law)ViewData["currentLaw"]).LawID }, new { @class = "btn btn-primary icon-plus" })

Я не мог интегрироваться <i> на Html.Actionlink.

Как я могу интегрировать <i> на Html.Actionlink как класс?

Любая помощь будет оценена.

Благодарю.

Обновить:

HtmlHelperActionLinkExtensions Class

  public static IDisposable BeginActionLink<TModel>(this HtmlHelper<TModel> htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
        {
            return new DisposableActionLink(htmlHelper.ViewContext, () => BeginLink(htmlHelper, actionName, controllerName, routeValues, htmlAttributes), EndActionLink);
        }

        private static MvcHtmlString BeginLink(HtmlHelper htmlHelper, string actionName, string controllerName,
            RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
        {
            var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            var linkTag = new TagBuilder("a");
            linkTag.Attributes.Add("href", urlHelper.Action(actionName, controllerName, routeValues));
            linkTag.MergeAttributes(htmlAttributes);

            return MvcHtmlString.Create(linkTag.ToString(TagRenderMode.StartTag));
        }

        private static MvcHtmlString EndActionLink()
        {
            return MvcHtmlString.Create("</a>");
        }

Класс DisposableActionLink

  public class DisposableActionLink : IDisposable
    {
        private readonly TextWriter _writer;
        private Func<MvcHtmlString> End { get; set; }

        public DisposableActionLink(ViewContext viewContext, Func<MvcHtmlString> begin, Func<MvcHtmlString> end)
        {
            _writer = viewContext.Writer;
            End = end;
            _writer.Write(begin().ToHtmlString());
        }

        public void Dispose()
        {
            _writer.Write(End().ToHtmlString());
        }
    }

Посмотреть:

@using Project.Models





   @Html.BeginActionLink("Add", "Law", new RouteValueDictionary { { "_lawfileid", "-1" }, 

{ "baseappid", ((ObjectModelLibrary.Law)ViewData["currentLaw"]).LawID } }, new 

Dictionary<string, object> { { "class", "btn btn-primary icon-plus" } })
    {
        <i class="icon-plus"></i>Add
    }

Результат Фото

Обычно значок должен быть + Добавить, однако он отображает разные вещи.

Картина

http://i.hizliresim.com/YPL6AZ.png

2 ответа

Решение

Самый простой способ справиться с вашей проблемой - это не использовать Html.ActionLink. Да, он не поддерживает вложенные теги, но вы можете просто сделать это:

<a href="@Url.Action("xx", "Law", new { _lawfileid = -1, baseappid = ((ObjectModelLibrary.Law)ViewData["currentLaw"]).LawID })" class="btn btn-primary icon-plus"><i class="icon-plus"></i>>Add</a>

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

public class DisposableActionLink : IDisposable
{
    private readonly TextWriter writer;
    private Func<MvcHtmlString> End { get; set; }

    public DisposableActionLink(ViewContext viewContext, Func<MvcHtmlString> begin, Func<MvcHtmlString> end)
    {
        writer = viewContext.Writer;
        End = end;
        writer.Write(begin().ToHtmlString());
    }

    public void Dispose()
    {
        writer.Write(End().ToHtmlString());
    }
}

public static class HtmlHelperActionLinkExtensions
{
    public static IDisposable BeginActionLink<TModel>(this HtmlHelper<TModel> htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
    {
        return new DisposableActionLink(htmlHelper.ViewContext, () => BeginLink(htmlHelper, actionName, controllerName, routeValues, htmlAttributes), EndActionLink);
    }

    private static MvcHtmlString BeginLink(HtmlHelper htmlHelper, string actionName, string controllerName,
        RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var linkTag = new TagBuilder("a");
        linkTag.Attributes.Add("href", urlHelper.Action(actionName, controllerName, routeValues));
        linkTag.MergeAttributes(htmlAttributes);

        return MvcHtmlString.Create(linkTag.ToString(TagRenderMode.StartTag));
    }

    private static MvcHtmlString EndActionLink()
    {
        return MvcHtmlString.Create("</a>");
    }
}

Так что теперь вы можете использовать его так:

@using (Html.BeginActionLink("xx", "Law", new RouteValueDictionary{{"_lawfileid", "-1"}, {"baseappid", ((ObjectModelLibrary.Law)ViewData["currentLaw"]).LawID}}, new Dictionary<string, object>{{"class", "btn btn-primary icon-plus"}})
{
    <i class="icon-plus"></i>@:Add
}

@Html.ActionLink(new MvcHtmlString("<i class='icon-plus'>Add</i>").ToHtmlString(), "xx", "Law", new { _lawfileid = -1, baseappid = ((ObjectModelLibrary.Law)ViewData["currentLaw"]).LawID }, new { @class = "btn btn-primary"})

Попробуй это.

Другие вопросы по тегам