9

ASP.NET MVC 用に独自の HtmlHelper 拡張機能を作成しています。

public static string CreateDialogLink (this HtmlHelper htmlHelper, string linkText, 
                                      string contentPath)
        {
            // fix up content path if the user supplied a path beginning with '~'
            contentPath = Url.Content(contentPath);  // doesn't work (see below for why)

            // create the link and return it
            // .....
        };

私が問題を抱えているのは、HtmlHelper の定義UrlHelperからアクセスしようとしていることです。問題は、 ( 経由で)通常アクセスする方法が ビューのプロパティ経由であることです。これは、明らかに私自身の拡張クラスからは利用できません。HtmlHelperHtml.MethodName(...)

ViewMasterPageこれは(ベータ版の)の実際の MVC ソース コードであり、 と を定義HtmlしていUrlます。

public class ViewMasterPage : MasterPage
    {
        public ViewMasterPage();

        public AjaxHelper Ajax { get; }
        public HtmlHelper Html { get; }
        public object Model { get; }
        public TempDataDictionary TempData { get; }
        public UrlHelper Url { get; }
        public ViewContext ViewContext { get; }
        public ViewDataDictionary ViewData { get; }
        public HtmlTextWriter Writer { get; }
    }

HtmlHelper 内でこれらのプロパティにアクセスできるようにしたいと考えています。

私が思いついた最高のものはこれです(CreateDialogLinkメソッドの先頭に挿入)

HtmlHelper Html = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer);
UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

既存のHtmlHelperインスタンスにアクセスする他の方法UrlHelperがありませんか?それとも新しいインスタンスを作成する必要がありますか? オーバーヘッドはあまりないと思いますが、可能であれば既存のものを使用したいと思います。

4

4 に答える 4

4

私は同様の問題に直面し、ビューで UrlHelper を呼び出して出力を HtmlHelper 拡張機能に渡す方が簡単だと判断しました。あなたの場合、次のようになります。

<%= Html.CreateDialogLink( "text", Url.Content( "~/...path.to.content" ) ) %>

クラスに渡された既存の HtmlHelper の拡張メソッドにアクセスする場合は、ソース コード ファイルに System.Web.Mvc.Html をインポートするだけで、それらにアクセスできるようになります (拡張クラスはここにあります)。が定義されています)。UrlHelper が必要な場合は、取得している HtmlHelper が元の ViewPage のハンドルを持っていないため、それをインスタンス化する必要があります。

于 2009-01-30T04:03:38.560 に答える
0

ページのインスタンスをいつでも拡張メソッドに渡すことができます。メソッドで新しいインスタンスを作成するよりも、これがはるかに優れた方法だと思います。

MasterPage/ViewMasterPage から派生したクラスでこのメソッドを定義し、そこからページを派生させることもできます。このようにして、インスタンスのすべてのプロパティにアクセスでき、それらを渡す必要はありません。

于 2009-01-30T03:03:30.337 に答える