Problema durante il recupero di AssemblyVersion in una pagina Web utilizzando Razor / MVC3


104

Sto usando il codice seguente in un piè di pagina nel mio file _Layout.cshtml per inserire i dati della versione di AssemblyInfo nel piè di pagina di ogni pagina del mio sito MVC3. Però:

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

Stampa solo nel piè di pagina:

Revision 0.0.0.0

Quando ho modificato la visualizzazione per visualizzare tutte le informazioni sull'assembly per "l'assembly in esecuzione" utilizzando quanto segue

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

Che stampa quanto segue:

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

Questo mostra che "Executing Assembly" non è la mia app principale, è la vista stessa.

Come ottengo le informazioni sull'assemblaggio per l'app ACTUAL, non solo le singole visualizzazioni?

Risposte:


218

cshtml / vbhtml è la compilazione dinamica in assembly.

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

cosa ne pensi di questo?


15
E @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionper tutti i VB.NETers. Entrambi.
edhubbell

Devo anche condividere le mie lodi: questa parte superiore della mia storia "mostra il numero di revisione nell'app per qa" insieme a [assembly: AssemblyVersion ("1.0. *")] Ottengo un numero di build dall'aspetto piacevole. Funziona alla grande.
nocarrier

4
Per i siti WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Potrebbe anche funzionare senza lo spazio dei nomi predefinito:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)restituisce 3 delle 4 parti della versione assembly se qualcuno è curioso. Puoi variare tra 0 e 4.
Mafii

1
in dotnet core 2.1 questo funziona per me: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}quindi<h1>Ver. @version</h1>
Leonard AB

16

L'utilizzo di questo aiuto funziona per me:

    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

Questo funziona per me. Senza bisogno di menzionare esplicitamente il tipo.

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

5

È necessario ottenere l'assembly di un tipo nel progetto:

typeof(MyType).Assembly.Whatever

Dove si MyTypetrova un qualsiasi tipo nel progetto MVC stesso (ad esempio, un controller o un modello o la MvcApplicationclasse)


Questa è in realtà una risposta migliore rispetto a quella accettata IMO, poiché rende chiaro che stai cercando un tipo che fa parte dell'assembly della tua applicazione. Una specie di spiega meglio la causa del problema.
Jim

4

Espandendo la risposta di takepara, se si desidera che un one liner ottenga AssemblyInformationalVersionAttribute da una vista MVC Razor:

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

1

Potresti provare a usare GetCallingAssembly (). Non sono sicuro che sia abbastanza alto nello stack di chiamate o meno, ma poiché Razor crea effettivamente un assembly per ogni visualizzazione, è ovvio che la tua app sarebbe l'assembly chiamante per l'assembly della visualizzazione.


Get Calling assembly va solo di un livello più in alto nell'albero ... ancora non va bene.
Jay Stevens

1

per un controller API ho usato questo sulla base di altre risposte

Version = GetType().Assembly.GetName().Version.ToString()

0

Il mio problema era che in seguito avevo rinominato lo spazio dei nomi e ho ricevuto l'errore sopra. Il problema era il vecchio riferimento allo spazio dei nomi in Views \ Web.config. Ho dovuto cambiarlo da Project.WebAPI17aCompany.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

Puoi ottenerlo utilizzando la proprietà Name come di seguito:

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

è quello che stai cercando?


-1

Vai su Home Controller e copia semplicemente questo codice:

Rinomina ActionResultin String

public string Index()

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

run view
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.