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

时间:2011-05-27 19:35:49

标签: c# asp.net-mvc-3 reflection assemblies razor

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

10 个答案:

答案 0 :(得分:205)

cshtml / vbhtml是动态编译到程序集。

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

怎么样?

答案 1 :(得分:14)

使用此帮助程序对我有用:

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

    }

答案 2 :(得分:11)

这对我有用。无需明确提及类型。

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

答案 3 :(得分:5)

您需要在项目中获取类型的程序集:

typeof(MyType).Assembly.Whatever

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

答案 4 :(得分:4)

扩展takepara的答案,如果你想要一个单行程序从MVC Razor View获取AssemblyInformationalVersionAttribute:

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

对于api控制器,我根据其他答案使用了

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

答案 7 :(得分: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>

答案 8 :(得分:0)

转到Home Controller并只复制此代码:

ActionResult重命名为String

public string Index()

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

run view

答案 9 :(得分:-1)

您可以使用Name属性获取它,如下所示:

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

是你在寻找什么?