12

我想寫一個HtmlHelper來渲染帶有預設值的ActionLink,例如。從控制器內部使用Html.ActionLink和Url.Action(...)

<%=Html.PageLink("Page 1", "page-slug");%> 

其中PageLink是調用ActionLink與已知的操作和控制,如功能。 「索引」和「頁面」。

由於HtmlHelperUrlHelper不存在於Controller或類內部,我如何從類內部獲取相對於動作的URL?

更新:鑑於額外三年累積的經驗,我現在有,這是我的建議是:只要使用Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" })或更好,但

<a href="@Url.Action("ViewPage", 
        new { 
          controller = "Page", 
          slug = "my-page-slug" })">My Link</a> 

您的擴展方法也許很可愛,短,但它增加另一個未經測試的失敗點和對新員工的新學習要求,無需增加任何實際價值。把它看作設計一個複雜的系統。爲什麼要添加另一個移動部分,除非它增加可靠性(否),可讀性(很少,一旦您閱讀更多文檔),速度(無)或併發(無)。

+0

+1爲更新。我也會指出未來的搜索者從控制器內部調用Url.Action這個問題 - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins 2015-09-29 21:49:11

回答

20

不知道我確實清楚你的問題,但是,讓我試試。

要像你描述的創建一個擴展的HtmlHelper,你可以試試:

using System; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace Something { 
    public static class PageLinkHelper 
    { 
     public static string PageLink(
      this HtmlHelper helper, 
      string linkText, string actionName, 
      string controllerName, object routeValues, 
      object htmlAttributes) 
     { 
      return helper.ActionLink(
       linkText, actionName, controllerName, 
       routeValues, htmlAttributes); 
     } 
    } 
} 

至於從一類獲得一個網址你的問題,要看是什麼樣的階級,你會實現它。例如,如果你想從一個的HtmlHelper擴展電流控制器和行動,你可以使用:

string currentControllerName = (string)helper.ViewContext 
    .RouteData.Values["controller"]; 
string currentActionName = (string)helper.ViewContext 
    .RouteData.Values["action"]; 

如果你想從控制器得到它,你可以使用從基類屬性/方法(控制器)構建URL。例如:

var url = new UrlHelper(this.ControllerContext.RequestContext); 
url.Action(an_action_name, route_values); 
+1

優秀回答。我試過沒有包裝它在一個靜態類,它不會註冊helper.ActionLink(...)。謝謝。 – 2010-04-11 13:33:15

+0

啊,我沒有導入System.Web.Mvc;我的錯。 – 2010-04-11 13:48:42

相關問題