使用Razor/MVC3在网页中获取AssemblyVersion的问题

112

我在我的_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

这表明"执行程序集"不是我的主要应用程序,而是视图本身。

我如何获取实际应用程序的程序集信息,而不仅仅是单个视图?

10个回答

228

cshtml/vbhtml是一种动态编译为程序集的语言。

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

这个怎么样?


16
对于所有VB.NET程序员,@GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Version。我们俩都是。 - edhubbell
我还必须分享我的赞扬 - 这超越了我的“在应用程序中显示QA修订号”的故事,以及[assembly: AssemblyVersion("1.0.*")],我得到了一个漂亮的构建号。非常有效。 - Shawn J. Molloy
5
对于WebAPI网站:@typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version。甚至可以在没有默认命名空间的情况下工作:@typeof(WebApiApplication).Assembly.GetName().Version。 该代码用于获取WebAPI应用程序程序集版本号,可以在有默认命名空间和无默认命名空间的情况下使用。 - Cristian Diaconescu
2
如果有人好奇,@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3) 返回程序集版本的 4 部分中的 3 部分。您可以在 0 和 4 之间变化。 - Mafii
我喜欢 Stack Overflow,因为它有这种类型的答案。虽然这个问题可能早在2011年就被回答了,但在2017年仍然证明它是救命稻草! - Paul
1
在dotnet core 2.1中,以下代码适用于我:@{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;} 然后 <h1>Ver. @version</h1> - Leonard AB

21

这对我有效,而且无需明确地提及类型。

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

也适用于相当老的.aspx页面。 - Tobias
很棒,也适用于.NET6,使用方法如下:<p class="w-100">构建日期:<br />@(new System.IO.FileInfo(ViewContext.GetType().Assembly.Location).LastWriteTime)</p> - Vedran Mandić

17

使用这个助手对我有效:

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

    }

6
你需要获取项目中类型的程序集:
typeof(MyType).Assembly.Whatever

其中MyType是MVC项目本身中的任何类型(例如,控制器或模型,或者MvcApplication类)


在我看来,这实际上是比被采纳的答案更好的回答,因为它明确了您正在寻找的类型是应用程序集的一部分。这有点更好地解释了问题的原因。 - Jim

4

在takepara的答案基础上进行扩展,如果您想从MVC Razor视图中获取AssemblyInformationalVersionAttribute,请使用下面的一行代码:

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

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>

0
你可以尝试使用GetCallingAssembly()。我不确定它是否在调用堆栈中属于较高位置,但由于Razor实际上为每个视图创建一个程序集,因此你的应用程序很可能是视图程序集的调用程序集。

获取调用程序集只能向上一级树形结构...仍然不好。 - Jay Stevens

-1

前往主页控制器,然后复制以下代码:

ActionResult 重命名为 String

public string Index()

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

run view

-2

您可以通过以下方式使用Name属性获取它:

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

这是您正在寻找的内容吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接