使用Razor / MVC3将AssemblyVersion放入网页时出现问题


103

我在_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应用程序的装配信息,而不仅仅是单个视图?

Answers:


217

cshtml / vbhtml是动态编译为汇编的。

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

这个怎么样?


15
@GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Version所有VB.NETers。我们俩。
edhubbell 2012年

我也必须分享我的赞美-我的“在应用程序中显示qa的修订版本号”故事的顶部以及[assembly:AssemblyVersion(“ 1.0。*”)]我得到一个漂亮的内部版本号。效果很好。
nocarrier

4
对于WebAPI网站:@typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version。它甚至可以在没有默认名称空间的情况下工作:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)如果有人好奇,则返回汇编版本4个部分中的3个。您可以在0到4之间变化
。– Mafii

1
在dotnet core 2.1中对我有用:@{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}然后<h1>Ver. @version</h1>
Leonard 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

MyTypeMVC项目本身中的任何类型在哪里(例如,控制器或模型或MvcApplication类)


实际上,这比公认的IMO更好,因为它清楚地表明您正在寻找属于应用程序程序集一部分的Type。可以更好地说明问题的原因。
吉姆(Jim)

4

如果要一个衬板从MVC Razor视图获取AssemblyInformationalVersionAttribute,请扩展takepara的答案:

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

1

您可以尝试使用GetCallingAssembly()。我不确定在调用堆栈中是否足够高,但是由于Razor实际上为每个视图都创建了一个程序集,因此可以推断您的应用将成为该视图程序集的调用程序集。


Get Calling程序集仅在树中上移了……仍然不好。
杰伊·史蒂文斯

0

我的问题是,此后我已重命名了命名空间,但出现了以上错误。问题是Views \ Web.config中的旧名称空间引用。我不得不将其从更改Project.WebAPI17Company.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.