web-dev-qa-db-ja.com

Razor / MVC3を使用してAssemblyVersionをWebページに取得する際の問題

_Layout.cshtmlファイルのフッターで次のコードを使用して、AssemblyInfoバージョンデータをMVC3サイトのすべてのページのフッターに入れています。しかしながら:

@System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()

フッターに印刷するだけです:

Revision 0.0.0.0

次を使用して「アセンブリの実行」のすべてのアセンブリ情報を表示するようにビューを変更したとき

@System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()

次を印刷します。

Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

これは、「Executing Assembly」が私のメインアプリではなく、ビューそのものであることを示しています。

個々のビューだけでなく、ACTUALアプリのアセンブリ情報を取得するにはどうすればよいですか?

99
Jay Stevens

cshtml/vbhtmlは、アセンブリへの動的コンパイルです。

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version

これはどう?

208
takepara

このヘルパーを使用すると私のために働く:

    public static HtmlString ApplicationVersion(this HtmlHelper helper)
    {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var version = asm.GetName().Version;
        var product = asm.GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), true).FirstOrDefault() as System.Reflection.AssemblyProductAttribute;

        if (version != null && product != null)
        {
            return new HtmlString(string.Format("<span>{0} v{1}.{2}.{3} ({4})</span>", product.Product, version.Major, version.Minor, version.Build, version.Revision));
        }
        else
        {
            return new HtmlString("");
        }

    }
14
Jay

これは私のために動作します。タイプを明示的に言及する必要はありません。

@ViewContext.Controller.GetType().Assembly.GetName().Version
11
Haohmaru

プロジェクトでタイプのアセンブリを取得する必要があります。

typeof(MyType).Assembly.Whatever

MyTypeは、MVCプロジェクト自体の任意のタイプ(コントローラーやモデル、またはMvcApplicationクラスなど)です。

5
SLaks

1つのライナーでMVC RazorビューからAssemblyInformationalVersionAttributeを取得する場合は、takeparaの答えを拡張します。

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
4
jslatts

GetCallingAssembly()を使用してみてください。それが呼び出しスタックまで十分に高いかどうかはわかりませんが、Razorは実際に各ビューのアセンブリを作成するため、アプリがビューアセンブリの呼び出しアセンブリになるのは当然のことです。

1
BAKeele

私の問題は、後で名前空間の名前を変更し、上記のエラーが発生したことです。問題は、Views\Web.configの古い名前空間参照でした。 Project.WebAPI17からCompany.Project.WebAPI17に変更する必要がありました

  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.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.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Company.Project.WebAPI17" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
0
florian.isopp

Home Controllerに移動して、次のコードをコピーします。

ActionResultの名前をStringに変更

public string Index()

   return typeof(Controller).Assembly.GetName().Version.ToString() ;

run view
0
prashant