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?

Odpowiedzi:


218

cshtml / vbhtml jest dynamiczną kompilacją do asemblacji.

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

co powiesz na to?


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

    }

13

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

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

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)


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

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.


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()

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>

-1

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

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

czy tego szukasz?


-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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.