Masalah memasukkan AssemblyVersion ke halaman web menggunakan Razor / MVC3

104

Saya menggunakan kode berikut di footer di file _Layout.cshtml saya untuk meletakkan data versi AssemblyInfo ke footer setiap halaman di situs MVC3 saya. Namun:

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

Hanya mencetak di footer:

Revision 0.0.0.0

Ketika saya mengubah tampilan untuk menampilkan semua info perakitan untuk "Majelis Pelaksana" menggunakan berikut ini

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

Yang mencetak berikut ini:

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

Ini menunjukkan bahwa "Majelis Pelaksana" bukanlah aplikasi utama saya, ini adalah tampilan itu sendiri.

Bagaimana cara mendapatkan informasi perakitan untuk aplikasi SEBENARNYA, bukan hanya tampilan individu ??

Jay Stevens
sumber

Jawaban:

218

cshtml / vbhtml adalah kompilasi dinamis untuk perakitan.

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

bagaimana dengan ini?

takepara
sumber
15
Dan @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionuntuk semua VB.NETers. Kita berdua.
edhubbell
Saya juga harus berbagi pujian saya - ini adalah bagian atas dari cerita "tampilkan nomor revisi di aplikasi untuk qa" bersama dengan [assembly: AssemblyVersion ("1.0. *")] Saya mendapatkan nomor build yang bagus. Bekerja dengan baik.
nocarrier
4
Untuk situs WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Ia bahkan dapat bekerja tanpa namespace default:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu
@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)mengembalikan 3 dari 4 bagian versi rakitan jika ada yang penasaran. Anda dapat bervariasi antara 0 dan 4.
Mafii
1
di dotnet core 2.1 ini berfungsi untuk saya: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}kemudian<h1>Ver. @version</h1>
Leonard AB
16

Menggunakan helper ini berhasil untuk saya:

    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("");
        }

    }
Jay
sumber
13

Ini berhasil untuk saya. Tanpa perlu menyebutkan jenisnya secara eksplisit.

@ViewContext.Controller.GetType().Assembly.GetName().Version
Haohmaru
sumber
5

Anda perlu mendapatkan perakitan tipe dalam proyek:

typeof(MyType).Assembly.Whatever

Di MyTypemana jenis apa pun dalam proyek MVC itu sendiri (misalnya, pengontrol atau model, atau MvcApplicationkelas)

SLaks
sumber
Ini sebenarnya adalah jawaban yang lebih baik daripada IMO yang diterima, karena memperjelas bahwa Anda sedang mencari Jenis yang merupakan bagian dari rakitan aplikasi Anda. Semacam menjelaskan penyebab masalah dengan lebih baik.
Jim
4

Memperluas jawaban takepara, jika Anda ingin satu liner mendapatkan AssemblyInformationalVersionAttribute dari MVC Razor View:

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

Anda bisa mencoba menggunakan GetCallingAssembly (). Saya tidak yakin apakah itu cukup tinggi untuk tumpukan panggilan atau tidak, tetapi karena Razor benar-benar membuat rakitan untuk setiap tampilan, masuk akal bahwa aplikasi Anda akan menjadi rakitan panggilan untuk rakitan tampilan.

BAKeele
sumber
Get Calling assembly hanya naik satu level di pohon ... masih tidak bagus.
Jay Stevens
1

untuk pengontrol api saya menggunakan ini berdasarkan jawaban lain

Version = GetType().Assembly.GetName().Version.ToString()
workabyte
sumber
0

Masalah saya adalah saya telah mengganti nama namespace setelah itu dan saya mendapatkan kesalahan di atas. Masalahnya adalah referensi namespace lama di Views \ Web.config. Saya harus mengubahnya dari Project.WebAPI17menjadiCompany.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>
florian.isopp
sumber
-1

Anda bisa mendapatkannya menggunakan properti Name seperti di bawah ini:

  @System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

apakah itu yang kamu cari?

matmat
sumber
-1

Pergi ke Home Controller dan salin saja kode ini:

Ubah nama ActionResultmenjadi String

public string Index()

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

run view
prashant
sumber