2

私はasp.netMVC4を使用していますが、私の見解ではこのようなことをしたいと思います

<a href=@NamespaceHere.StaticUtil.TheFunctionIUseAlot("/blah", 1, Viewbag, "link and view specific") class="thing">my link</a>

私はそれが気に入りません。名前空間を暗黙的にする方法はありますか?Viewbagを渡して、global.request.current.viewbagのように取得することはできませんか?

それが役立つ場合は、TheFunctionIUseAlotを静的にする必要はありません。すべてのビューで簡単に呼び出せるようにする必要があります。ビューバッグを渡さないようにしたいと思います。ビューバッグを渡す理由は、ビューバッグに貼り付けたコントローラーに何かが必要なためです。たぶん私はそれをモデルに入れることができますが、ビューバッグの代わりにモデルを渡す場合と同じ問題は望んでいません

4

1 に答える 1

1

@using NamespaceHere;ビューの上部に追加するか、ビューのWeb構成に名前空間として登録することにより、名前空間を暗黙的にすることができます。このようなもの:

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="NamespaceHere"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

ビューにカスタムページベースタイプを使用すると、関数でビューバッグにアクセスできます。これを行うための手順は、http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspxにあります。

あなたの状況では、ViewBagにアクセスするには、FunctionThatIUseALotWebViewPageをコンストラクターパラメーターとして(動的またはViewDataDictionaryとして)受け取る非静的クラスで定義する必要があります。次に、WebViewPageのInitHelpersオーバーライドで、ヘルパークラスを作成してを渡すことができますthis。これにより、WebViewPageのすべての標準プロパティにアクセスできるようになります。

このようなもの:

public class Utils {
    private WebViewPage page;
    public Utils(WebViewPage page) { this.page = page; }

    public FunctionThatIUseALot(string someParameter) {
        string someViewBagValue = page.ViewBag.SomeViewBagValue;
    }
}

public abstract class CustomWebViewPage : WebViewPage {
  public Utils Utils { get; set; } // Utils is your helper class

  public override void InitHelpers() {
    base.InitHelpers();
    Utils = new Utils(this);
  }
}

上記はそれを機能させるためにあなたがする必要があるすべてではありません、あなたは残りのために記事を読む必要があるでしょう。@Utils.FunctionThatIUseALot("some value")ただし、最終的には、ビューで直接呼び出すことができるようになります。

注:これは2回行う必要があります。1回は標準WebViewPageの基本クラス用で、もう1回はWebViewPage<TModel>基本クラス用です。

于 2013-01-24T03:23:46.560 に答える