Проблема с получением AssemblyVersion на веб-странице с помощью Razor / MVC3


105

Я использую следующий код в нижнем колонтитуле моего файла _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

Это показывает, что «Executing Assembly» - это не мое основное приложение, это само представление.

Как мне получить информацию о сборке для АКТУАЛЬНОГО приложения, а не только отдельные представления?

Ответы:


219

cshtml / vbhtml - это динамическая компиляция в сборку.

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

как насчет этого?


15
И @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionдля всех любителей VB.NET. Мы оба.
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.
Mafii

1
в ядре dotnet 2.1 это работает для меня: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}затем<h1>Ver. @version</h1>
Леонард AB

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класс)


На самом деле это лучший ответ, чем принятый IMO, поскольку он дает понять, что вы ищете Type, который является частью сборки вашего приложения. Вроде как лучше объясняет причину проблемы.
Джим

4

Расширяя ответ takepara, если вы хотите, чтобы один лайнер получил AssemblyInformationalVersionAttribute из представления MVC Razor:

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

1

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


Сборка Get Calling просто поднимается на один уровень вверх по дереву ... все еще бесполезно.
Джей Стивенс

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

Перейдите в Home Controller и просто скопируйте этот код:

Переименовать ActionResultв строку

public string Index()

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

run view
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.