16

ac# 関数内で @Html.ActionLink メソッドを呼び出して、リンクを含む文字列を返したいと考えています。

このようなもの:

string a = "Email is locked, click " + @Html.ActionLink("here to unlock.", "unlock") ;
4

5 に答える 5

8

コントローラーでこれを達成したいと仮定すると、ジャンプする必要があるいくつかのフープがあります。ViewDataDictionaryとをインスタンス化する必要がありますTempDataDictionaryControllerContext次に、 を取得してを作成する必要がありますIView。最後に、HtmlHelperこれらすべての要素 (およびRouteCollection) を使用して を作成する準備が整いました。

これをすべて完了したら、 を使用LinkExtensions.ActionLinkしてカスタム リンクを作成できます。ビューでは、 を使用@Html.Raw()してリンクを表示し、リンクが HTML エンコードされないようにする必要があります。必要なコードは次のとおりです。

var vdd = new ViewDataDictionary();
var tdd = new TempDataDictionary();
var controllerContext = this.ControllerContext;
var view = new RazorView(controllerContext, "/", "/", false, null);
var html = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
     new ViewDataContainer(vdd), RouteTable.Routes);
var a = "Email is locked, click " + LinkExtensions.ActionLink(html, "here to unlock.", "unlock", "controller").ToString();

これらすべてを示したので、あなたの見解では、これを行う方がはるかに良い考えであることに注意してください. エラーとその他の情報を ViewModel に追加し、ビューをコーディングしてリンクを作成します。これが複数のビューで必要な場合は、HtmlHelper を作成してリンクを作成します。

アップデート

one.beat.consumer に対処するために、私の最初の答えは、可能なことの例でした。開発者がこの手法を再利用する必要がある場合、次のように複雑さを静的ヘルパーに隠すことができます。

public static class ControllerHtml
{
    // this class from internal TemplateHelpers class in System.Web.Mvc namespace
    private class ViewDataContainer : IViewDataContainer
    {
        public ViewDataContainer(ViewDataDictionary viewData)
        {
            ViewData = viewData;
        }

        public ViewDataDictionary ViewData { get; set; }
    }

    private static HtmlHelper htmlHelper;

    public static HtmlHelper Html(Controller controller)
    {
        if (htmlHelper == null)
        {
            var vdd = new ViewDataDictionary();
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }

    public static HtmlHelper Html(Controller controller, object model)
    {
        if (htmlHelper == null || htmlHelper.ViewData.Model == null || !htmlHelper.ViewData.Model.Equals(model))
        {
            var vdd = new ViewDataDictionary();
            vdd.Model = model;
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }
}

次に、コントローラーでは、次のように使用されます。

var a = "Email is locked, click " + 
    ControllerHtml.Html(this).ActionLink("here to unlock.", "unlock", "controller").ToString();

またはそのように:

var model = new MyModel();
var text = ControllerHtml.Html(this, model).EditorForModel();

使い方は簡単ですがUrl.Action、これは強力なツールに拡張され、すべての HtmlHelper (完全な Intellisense を使用) を使用して、コントローラー内で任意のマークアップを生成できます。

使用の可能性には、モデルを使用したマークアップの生成、電子メール用のエディター テンプレート、pdf 生成、オンライン ドキュメント配信などが含まれます。

于 2011-11-30T19:49:29.017 に答える
6

HtmlHelper 拡張メソッドを作成できます。

public static string GetUnlockText(this HtmlHelper helper)
{
    string a = "Email is locked, click " + helper.ActionLink("here to unlock.", "unlock");
    return a;
}

または、aspx ページの範囲外でこのリンクを生成する場合は、HtmlHelper への参照を作成してから生成する必要があります。私はこれをUrlUtility静的クラスで行います (人々は静的クラスとユーティリティという言葉を嫌いますが、集中しようとします)。必要に応じてオーバーロードします。

public static string ActionLink(string linkText, string actionName, string controllerName)
{
    var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current);
    var requestContext = new RequestContext(httpContext, new RouteData());
    var urlHelper = new UrlHelper(requestContext);

    return urlHelper.ActionLink(linkText, actionName, controllerName, null);
}

次に、心から望むところから次のように書くことができます。

string a = "Email is locked, click " + UrlUtility.ActionLink("here to unlock.", "unlock", "controller");
于 2011-11-30T18:37:09.050 に答える
6

これらの他の回答にはいくつかの悪い点があります...

Shark の回答では、LinkExtensions 名前空間を C# に組み込む必要があります。これは間違いではありませんが、私にとっては望ましくありません。

ヘルパーを作成するという Hunter のアイデアの方が優れていますが、それでも 1 つの URL に対してヘルパー関数を作成するのは面倒です。パラメーターを受け入れる文字列を作成するのに役立つヘルパーを作成することも、単純に昔ながらの方法で行うこともできます。

var link = "Email is... click, <a href=\"" + Url.Action("action") + "\"> to unlock.</a>";

@カウンセラーベン、

複雑さの理由はわかりません。ユーザーは、アクションのルーティングをアンカー タグを含むハード文字列にレンダリングすることだけを望んでいます。さらに、ハードに作成された連結文字列内の ActionLink() は何も購入せず、開発者はビュー用の LinkExtensions を使用する必要があります。

ユーザーが ActionLink() の使用に熱心な場合、または (何らかの理由で) コンストラクターでこの文字列を計算する必要がない場合は、ビューで計算する方がはるかに優れています。

私はまだ待機しており、tvanfosson と私が提供した回答をお勧めします。

于 2011-11-30T18:46:40.483 に答える
4

最善の策は、コントローラーで利用可能な UrlHelper を使用して手動でリンクを作成することです。そうは言っても、ビューまたは部分ビュー、共有またはその他の方法でこれを処理するより良い方法があるのではないかと思います。

string a = "Email is locked, click <a href=\""
              + Url.Action( "unlock" )
              + "\">here to unlock.</a>";
于 2011-11-30T18:42:21.780 に答える
1

多分これを試してください:

string a = "Email is locked, click " + System.Web.Mvc.Html.LinkExtensions.ActionLink("here to unlock.", "unlock");
于 2011-11-30T18:37:26.107 に答える