コントローラー内からの Html.ActionLink と Url.Action(…) の使用
-
26-09-2019 - |
質問
HtmlHelper を作成して、事前設定された値を使用して ActionLink をレンダリングしたいと考えています。
<%=Html.PageLink("Page 1", "page-slug");%>
どこ PageLink
を呼び出す関数です ActionLink
既知のアクションとコントローラーを使用します。「インデックス」と「ページ」。
以来 HtmlHelper
そして UrlHelper
内部には存在しません Controller
またはクラスの場合、クラス内からアクションへの相対 URL を取得するにはどうすればよいですか?
アップデート: さらに 3 年間の経験を積んで、私からのアドバイスは次のとおりです。ただ使ってください 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>
あなたの拡張方法は短くてかわいいかもしれませんが、実際の価値はまったく追加されずに、テストされていない障害点がさらに追加され、採用者に新たな学習要件が追加されます。それは複雑なシステムを設計することだと考えてください。信頼性 (いいえ) や可読性 (一度読んだらほとんどわかりません) が追加されない限り、なぜ別の可動部分を追加する必要がありますか もっと docs)、速度 (なし)、または同時実行性 (なし)。
解決
わからない私は実際に私が試してみましょう、明らかにあなたの質問を理解し、しかします。
あなたが述べたように、のような何かをしようと、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"];
あなたは、コントローラからそれを取得したい場合は、、あなたはURLを構築するために、基本クラス(コントローラ)からのプロパティ/メソッドを使用することができます。たとえばます:
var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);