Asp.net-Mvc

從控制器內部使用 Html.ActionLink 和 Url.Action(…)

  • September 3, 2013

我想編寫一個 HtmlHelper 來呈現具有預設值的 ActionLink,例如。

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

where是一個使用已知 Action 和 ControllerPageLink呼叫的函式,例如。ActionLink“索引”和“頁面”。

由於或類中不存在HtmlHelper並且UrlHelper不存在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>

您的擴展方法可能既可愛又簡短,但它增加了另一個未經測試的故障點和對員工的新學習要求,而不會增加任何實際價值。把它想像成設計一個複雜的系統。為什麼要添加另一個移動部分,除非它增加了可靠性(否)、可讀性(很少,一旦您閱讀更多文件)、速度(無)或併發性(無)。

不確定我是否真的清楚地理解了你的問題,但是,讓我試試。

要像您描述的那樣創建 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);
       }
   }
}

至於您關於從類中獲取 URL 的問題,取決於您將實現它的類。例如,如果您想從 HtmlHelper 擴展中獲取目前控制器和操作,您可以使用:

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

如果您想從控制器中獲取它,您可以使用基類 (Controller) 中的屬性/方法來建構 URL。例如:

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

引用自:https://stackoverflow.com/questions/2617064