Проблема з завантаженням AssemblyVersion на веб-сторінку за допомогою Razor / MVC3


104

Я використовую такий код у нижньому колонтитулі у своєму файлі _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

Це свідчить про те, що "Виконання збірки" не є моїм головним додатком, це сам погляд.

Як я можу отримати інформацію про збірку для програми ACTUAL, а не лише для окремих переглядів ??

Відповіді:


218

cshtml / vbhtml - це динамічна компіляція до збирання.

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

як щодо цього?


15
І @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionдля всіх VB.NETers. Ми двоє.
edhubbell

Я також повинен поділитися моєю похвалою - цей верх моєї історії "показує номер редакції в додатку для qa" разом із [Assembly: AssemblyVersion ("1.0. *")] Я отримую гарний зовнішній номер збірки. Чудово працює.
nocarrier

4
Для сайтів WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Він може працювати навіть без простору імен за замовчуванням:@typeof(WebApiApplication).Assembly.GetName().Version
Крістіан Діаконеску,

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)повертає 3 з 4 частин монтажної версії, якщо комусь цікаво. Ви можете змінюватись від 0 до 4.
Мафій

1
в ядрі dotnet 2.1 це працює для мене: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}тоді<h1>Ver. @version</h1>
Леонард АБ

16

Використання цього помічника працює для мене:

    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

Це працює для мене. Без необхідності чітко згадувати тип.

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

5

Вам потрібно отримати збірку типу в проекті:

typeof(MyType).Assembly.Whatever

Де MyTypeбудь-який тип у самому проекті MVC (наприклад, контролер або модель або MvcApplicationклас)


Це насправді краща відповідь, ніж прийнятий ІМО, оскільки це дає зрозуміти, що ви шукаєте тип, який є частиною складання вашої програми. Сортування пояснює причину проблеми краще.
Джим

4

Розширення на відповідь takepara, якщо ви хочете, щоб один лайнер отримав AssemblyInformationalVersionAttribute з MVC Razor View:

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

1

Ви можете спробувати використати GetCallingAssembly (). Я не впевнений, чи достатньо це високий рівень стека викликів чи ні, але оскільки Razor фактично створює збірку для кожного перегляду, очевидно, що ваш додаток буде викликом для складання перегляду.


Get Calling Assembly просто йде на один рівень вгору по дереву ... все одно нічого хорошого.
Джей Стівенс

1

для контролера api я використав це на основі інших відповідей

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

0

Моя проблема полягала в тому, що я перейменував простір імен згодом і отримав помилку вище. Проблемою була стара посилання на простір імен у 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>

-1

Ви можете отримати його за допомогою властивості Name, як показано нижче:

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

це те, що ви шукаєте?


-1

Перейдіть на головний контролер та просто скопіюйте цей код:

Перейменувати ActionResultна рядок

public string Index()

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

run view
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.