2015-09-10 46 views
0

有很好的擴展方法可以在ASP MVC中生成ActionLinks/RouteLinks。但是它只允許您在生成的標籤內寫入純文本。如果你想在裏面生成錨點怎麼辦?帶有HTML內容的ASP MVC動作鏈接

我想創建一個使用圖標從引導鏈接:)這樣

// 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會生成由jquery-unobtrusive-ajax-min.js庫處理的javascript或'data- *'屬性的錨點。

回答

1

所以我寫了我的目的擴展方法,以使用@ Html.BeginForm/@ Ajax.BeginForm(使用環繞)的方式生成ActionLinks/RouteLinks。

用法:

// 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)); 
    } 
    } 
}