2012-02-22 1 views
0

UrlHelperクラスに似たヘルパークラスを作成して、クラスのインスタンス化がビューに使用可能になっている必要がありますが、UrlHelperがインスタンス化されて使用可能になった場所で作業することはできません私が同じことをしたいのと同じように、@Urlとしてのビューで。リクエストごとにヘルパークラスインスタンスのようなUrlHelperを作成しますか?

誰でも私を啓発することはできますか?

+0

なぜこのようなことをしたいですか?私たちが達成しようとしているものに対して良い解決策を見つけるために説明してください。 –

+0

なぜ私はしたくないですか?私がしたいことは、UrlHelperのように振る舞う独自のヘルパーを作成することです。自動的にインスタンス化され、すべてのビューで利用可能です。 – Moo

答えて

4

これまでにこれまでやったことはありませんが、試してみることができます。

System.Web.Mvc.ViewPageを拡張する新しいクラスを作成してみてください。私はこのマシンにMVCソースを持っていないので、フレームワークがビューのこのインスタンスをどのように作成するのかを正確に言うことはできませんが、Web.configのベースページタイプを変更してMVCを作成できる自分のタイプではなく新しいタイプのインスタンス。

これで、新しいタイプに必要なプロパティを追加し、ビューからアクセスできるようにすることができます。

あなたはまた、そのタイプのための一般的なを作成する必要があるだろう:Your.New.Page.Type<T>、と(私はこれはカミソリで行われているかを正確にはわかりません)あなたのビューのタイプとしてのことを宣言します

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Youre.New.Page.Type" %> 

おそらく、私は行方不明のものがたくさんあります。

<configuration> 
    <system.web> 

    <pages 
     validateRequest="false" 
     pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
     pageBaseType="Your.New.Page.Type, Your.New" 
     userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    </pages> 
    </system.web> 
</configuration> 
+0

ビンゴ、これは私が調べる必要があるもののように見えるが、より多くの情報を検索するための開始点を見つけることが困難だった:)感謝! – Moo

1

このようなあなたのヘルパーを作成します:彼らは異なる名前空間にある場合は、あなたがでこれを持っている必要があり

@Url.SomeUrl() 

public static class Extensions 
{ 
    public static string SomeUrl(this UrlHelper urlHelper) 
    { 
     return "someUrl"; 
    } 
} 

そして、あなたのビューであなたはこのようにそれを参照することができますあなたのビューの上部:

@using YourContainingExtNameSpace 

EDIT:あなたはUrlHelperクラスを拡張したくない場合は

は、あなたがこのように別々のクラスを作ることができる:

public class UrlGenerator 
{ 
    public string MakeUrl() 
    { 
     return "someUrl"; 
    } 
} 

を限り、あなたはあなたのビューでこの参照を持っているとして、

@{ 
    UrlGenerator ug = new UrlGenerator(); 
    ug.MakeUrl(); 
} 
+0

私が尋ねたことではなく、私がやりたいことではないこと - 私はUrlHelperのように動作するヘルパーを作成したいのですが、リクエストごとに新しいインスタンスが@Urlとして利用可能になり、UrlHelperに追加の機能が拡張されません。 – Moo

+0

@Moo私の編集を参照してください。それはあなたの質問に答えますか? –

+0

私は特にUrlGeneratorが静的クラスではなくクラスのインスタンスである必要があるため、実際はありません。編集のおかげでありがとう:) – Moo

3

コントローラのUrlHelperは、MVCフレームワーク自体で設定されています。ビューで使用可能な別のオブジェクトレベルのプロパティをコントローラに追加するには、フレームワークをハッキングする必要があります(間違っている場合は教えてください)。

一般に、ビューに必要なオブジェクトを返す拡張メソッドを作成することをお勧めします。

public static class UrlHelperExtensions 
{ 
    public static MyObjectType GetMyObject(this UrlHelper urlHelper) 
    { 
     return new MyObjectType(); 
    } 
} 

は、このようなGetMyObject()を使用するには:たとえば

<namespaces> 
    <!-- other namespaces will be here --> 
    <add namespace="My.Namespace" /> 
</namespaces> 

更新:@Url.GetMyObject()、あなたが拡張メソッドは、あなたのWeb.configファイルで宣言されている名前空間を含める必要があなたのコメントへの応答は、お使いのモデルに非表示固有の機能を追加することを検討:

@Model.MyObject.GetSomeProperty() 
+0

それを他のヘルパーに掛けることで、ある程度問題を解決できますが、見た目は非常にハッキーです。また、関連性のない機能を1つのものから外す必要があります私が最初に避けようとしているのは、既存のヘルパーのことです。 – Moo

+0

@Moo - 私は、MVCでViewのアイデアは、提供されたControllerオブジェクトのすべての機能がViewなぜそんなに多くの拡張機能がHtmlHelを使うのですか?クラスごと:拡張機能は一般にHTMLのレンダリング(ビュー固有)に関係します。ビューに関係しない追加の機能が必要な場合は、おそらくその機能をコントローラではなくモデルに組み込む必要があります。 – ken

+0

kenだから、本質的に言っていることは、既存のヘルパーの拡張メソッドとしてうまく機能しない、モデルに固有ではなく、ビュー固有でない追加のヘルパー機能の範囲がないということです。基本的に私がやりたいことは、モデルに固有ではなく、ビューに固有ではない機能を提供していますが、無関係で現在利用可能なヘルパーから離している気がしません。 – Moo

0

私はUrlHelperの拡張を作成していると思うし、そこにあなたのニーズを実現することができる唯一のこと:

pageBaseType属性を参照してください。

public static class UrlExtensions 
{ 
    public static string CustomThingy(this UrlHelper urlHelper) 
    { 
     //Do your custom stuff in here and add extra parameters if you need them 
     //For example some Func or Expression or more simpler a string 
    } 
} 

質問はまだあなたには、いくつかのケースでは、AjaxExtensionまたはHtmlExtensionを書くことが容易になるので、それをどうしたいものですが。それがあなたの質問に対する私の最初のコメントの理由でした。すべてが、さまざまな概念へのアクセスを提供します。

public static class HtmlExtensions 
{ 
    public static string CustomThingy(this HtmlHelper urlHelper) 
    { 

    } 
} 

public static class AjaxExtensions 
{ 
    public static string CustomThingy(this AjaxHelper urlHelper) 
    { 

    } 
}