質問

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top