12

事前設定された値でActionLinkをレンダリングするHtmlHelperを作成したいと思います。

<%=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>

あなたの拡張方法はかわいくて短いかもしれませんが、それは別のテストされていない障害点と、実際の価値をまったく追加せずに採用するための新しい学習要件を追加します。複雑なシステムを設計することと考えてください。信頼性(いいえ)、読みやすさ(少し、ドキュメントをもっと読んだら)、速度(なし)、または並行性(なし)を追加しない限り、なぜ別の可動部分を追加するのですか?

4

1 に答える 1

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);
        }
    }
}

クラスから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);
于 2010-04-11T13:30:24.883 に答える