Asp.net-Mvc
從控制器內部使用 Html.ActionLink 和 Url.Action(…)
我想編寫一個 HtmlHelper 來呈現具有預設值的 ActionLink,例如。
<%=Html.PageLink("Page 1", "page-slug");%>where是一個使用已知 Action 和 Controller
PageLink呼叫的函式,例如。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);