Problem z pobieraniem AssemblyVersion do strony internetowej przy użyciu Razor / MVC3

104

Używam następującego kodu w stopce w moim pliku _Layout.cshtml, aby umieścić dane wersji AssemblyInfo w stopce każdej strony w mojej witrynie MVC3. Jednak:

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

Po prostu drukuje w stopce:

Revision 0.0.0.0

Kiedy zmodyfikowałem widok, aby wyświetlić wszystkie informacje o zestawie dla „Wykonywania zestawu”, używając następującego

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

Który drukuje następujące:

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

To pokazuje, że „Wykonywanie zestawu” nie jest moją główną aplikacją, jest to sam widok.

Jak uzyskać informacje o zestawie dla aplikacji ACTUAL, a nie tylko o poszczególnych widokach?

Jay Stevens
źródło

Odpowiedzi:

218

cshtml / vbhtml jest dynamiczną kompilacją do asemblacji.

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

co powiesz na to?

takepara
źródło
15
I @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versiondla wszystkich VB.NETers. My oboje.
edhubbell
Muszę też się pochwalić - ten wierzchołek mojej historii "pokaż numer wersji w aplikacji dla qa" wraz z [assembly: AssemblyVersion ("1.0. *")] Otrzymuję ładnie wyglądający numer kompilacji. Działa świetnie.
nocarrier
4
W przypadku witryn WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Może nawet działać bez domyślnej przestrzeni nazw:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu
@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)zwraca 3 z 4 części wersji zestawu, jeśli ktoś jest ciekawy. Możesz zmieniać się od 0 do 4.
Mafii
1
w dotnet core 2.1 to działa dla mnie: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}wtedy<h1>Ver. @version</h1>
Leonard AB
16

U mnie działa ten pomocnik:

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

    }
Sójka
źródło
13

To działa dla mnie. Bez konieczności jawnego podawania typu.

@ViewContext.Controller.GetType().Assembly.GetName().Version
Haohmaru
źródło
5

Musisz uzyskać montaż typu w projekcie:

typeof(MyType).Assembly.Whatever

Gdzie MyTypeznajduje się dowolny typ w samym projekcie MVC (np. Kontroler, model lub MvcApplicationklasa)

SLaks
źródło
W rzeczywistości jest to lepsza odpowiedź niż zaakceptowana jedna IMO, ponieważ jasno określa, że ​​szukasz typu, który jest częścią zestawu aplikacji. W pewnym sensie lepiej wyjaśnia przyczynę problemu.
Jim
4

Rozwijając odpowiedź takepary, jeśli chcesz, aby jeden liniowiec pobierał AssemblyInformationalVersionAttribute z widoku Razor MVC:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
jslatts
źródło
1

Możesz spróbować użyć metody GetCallingAssembly (). Nie jestem pewien, czy jest to wystarczająco wysoko na stosie wywołań, czy nie, ale ponieważ Razor faktycznie tworzy zestaw dla każdego widoku, jest oczywiste, że aplikacja byłaby wywoływanym zestawem dla zestawu widoku.

BAKeele
źródło
Zespół Get Calling przechodzi tylko jeden poziom wyżej w drzewie ... nadal nie jest dobry.
Jay Stevens
1

w przypadku kontrolera API użyłem tego na podstawie innych odpowiedzi

Version = GetType().Assembly.GetName().Version.ToString()
workabyte
źródło
0

Mój problem polegał na tym, że później zmieniłem nazwę przestrzeni nazw i otrzymałem powyższy błąd. Problem polegał na odwołaniu do starej przestrzeni nazw w pliku Views \ Web.config. Musiałem to zmienić z Project.WebAPI17naCompany.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
źródło
-1

Możesz to uzyskać za pomocą właściwości Nazwa, jak poniżej:

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

czy tego szukasz?

matmat
źródło
-1

PRZEJDŹ do Home Controller i po prostu skopiuj ten kod:

Zmień nazwę ActionResultna String

public string Index()

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

run view
prashant
źródło