Проблема с получением 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

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

Takepara
источник
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класс)

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

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

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
jslatts
источник
1

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

BAKeele
источник
Сборка 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>
florian.isopp
источник
-1

Вы можете получить его, используя свойство Name, как показано ниже:

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

это то, что вы ищете?

матмат
источник
-1

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

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

public string Index()

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

run view
прашант
источник