Таким образом, я написал для своих целей методы расширения для генерации 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));
}
}
}