2015-09-10 8 views
0

Есть хорошие методы расширения для генерации ActionLinks/RouteLinks в ASP MVC. Однако он позволяет писать обычный текст внутри сгенерированного тега. Что делать, если вы хотите создать якорь с изображением внутри?ASP MVC ActionLinks с содержимым HTML

Я хотел создать ссылки с помощью иконки из начальной загрузки:

// expected result 
<a href="/Customer?page=1"><i class="glyphicon glyphicon-arrow-left"></i> Previous page</a> 

Если вы хотите создать простую ссылку, вы можете использовать @ Url.Action(), как это:

<a href="@Url.Action("Index","Customer", new{ page = 1 })"><i class="glyphicon glyphicon-arrow-left"></i> Previous page</a> 

Но когда вы хотите создать ajax-ссылки, это не так просто. Поскольку @ Ajax.ActionLink генерирует якорь с атрибутами javascript или 'data- *', которые обрабатываются библиотекой jquery-unobtrusive-ajax-min.js.

ответ

1

Таким образом, я написал для своих целей методы расширения для генерации ActionLinks/RouteLinks так, как вы используете @ Html.BeginForm/@ Ajax.BeginForm (окруженный использованием).

Использование:

// instead 
@Html.ActionLink("Previous page", "Index", "Customer", new { page = 1 }) 

// you can write 
@using(Html.BeginActionLink("Index", "Customer", new { page = 1 }) { 
    <text><i class="glyphicon glyphicon-arrow-left"></i> Previous page</text> 
} 

// same with ajax links 
@using(Ajax.BeginActionLink("Index", new { page = 1 }, new AjaxOptions { ... }) { 
    <text><i class="glyphicon glyphicon-arrow-left"></i> Previous page</text> 
} 

Методы BeginActionLink возвращают экземпляр класса MvcLink, который реализует IDisposable. В конструкторе он записывает начальный тег, а при его размещении он записывает конечный тег. Между фигурных скобках есть место для вашего кода

namespace System.Web.Mvc 
{ 
    using System.Text.RegularExpressions; 

    public class MvcLink : IDisposable 
    { 
    internal static readonly string InnerText = "___F7ED35E0097945398D5A969F8DE2C63C___"; 
    private static readonly Regex RegexPattern = new Regex(@"^\s*(?<startTag>.*)\s*" + InnerText + @"\s*(?<endTag>.*)\s*$", RegexOptions.Compiled | RegexOptions.Singleline); 

    private readonly ViewContext _viewContext; 
    private readonly string _endTag; 

    internal MvcLink(ViewContext viewContext, IHtmlString actionLink) { 
     _viewContext = viewContext; 
     var match = RegexPattern.Match(actionLink.ToHtmlString()); 
     if (match.Success) { 
     var startTag = match.Groups["startTag"].Value; 
     _endTag = match.Groups["endTag"].Value; 
     _viewContext.Writer.Write(startTag); 
     } 
    } 

    public void Dispose() { 
     _viewContext.Writer.Write(_endTag); 
    } 
    } 
} 

Тогда это до вас, чтобы написать методы расширения для HtmlHelper и AjaxHelper. Слишком много перегрузок для метода ActionLink/RouteLink, поэтому я подготовил только те, которые я действительно использую в своем приложении.

Но легко написать другие. Вы можете увидеть, что я создаю экземпляр MvcLink, он воспринимает ViewContext как первый параметр и результат встроенного ActionLink с предопределенным InnerText, который будет заменен вашим контентом.

namespace System.Web.Mvc 
{ 
    using System.Web.Mvc.Ajax; 
    using System.Web.Mvc.Html; 

    public static class MvcHelperExtensions 
    { 
    public static MvcLink BeginActionLink(this AjaxHelper ajaxHelper, string actionName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes) { 
     return new MvcLink(ajaxHelper.ViewContext, ajaxHelper.ActionLink(MvcLink.InnerText, actionName, routeValues, ajaxOptions, htmlAttributes)); 
    } 

    public static MvcLink BeginActionLink(this HtmlHelper htmlHelper, string actionName, object routeValues, object htmlAttributes) { 
     return new MvcLink(htmlHelper.ViewContext, htmlHelper.ActionLink(MvcLink.InnerText, actionName, routeValues, htmlAttributes)); 
    } 
    } 
}