在ASP.NET MVC Web应用程序中忽略了AssemblyInfo版本控制?

7

这里有一个奇怪的问题。我的MVC Web应用程序的版本号根据在AssemblyInfo.cs中设置的内容未能正确打印到我的视图中。我在AssemblyInfo.cs中设置的定义是'1.0.232.0'。

我尝试了多种方法来打印它:

<%= System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()%>

(结果为 0.0.0.0)

<%= System.Reflection.Assembly.GetCallingAssembly().GetName().Version.ToString()%>

结果为2.0.0.0,在我的项目中没有设置。

<%= typeof(HomeController).GetType().Assembly.GetName().Version.ToString()%>

(结果为2.0.0.0)

这让我相信它肯定没有读取到我的AssemblyInfo.cs文件? 如果我尝试使用"发布"按钮发布到我们开发服务器上的IIS时,情况也是如此。

有什么想法吗?也许我使用的获取版本号的语句不正确? :\

谢谢大家。

1个回答

13

默认情况下,视图仍然大部分是按需编译的,因此您不能可靠地在视图中使用GetExecutingAssembly(),但是对我来说控制器用法可以正常工作:

[assembly: AssemblyVersion("1.2.3.4")]

使用:

<h2><%=typeof(MvcApplication4.Controllers.HomeController).Assembly
   .GetName().Version.ToString() %></h2>

在页面中显示

1.2.3.4

编辑 您犯的错误是调用typeof(...).GetType() - 这将给出Type(或子类)- 因此,是2.x。 /编辑

有关预编译视图的额外步骤,请参见“MSBuild任务编译视图”here

可以说,你的视图本身不应该获取这些数据 - 应该将其放入ViewData(或类似的地方),也许由基本控制器或操作筛选器来完成。


关于主页面的问题;首先,选择一个关键字 ;-p

<%=ViewData["AppVersion"] %>

那么就有两个选择:在控制器(或公共基础控制器)中覆盖OnActionExecuting:

    protected override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["AppVersion"] =
            GetType().Assembly.GetName()
            .Version.ToString(); // probably cached
        base.OnActionExecuting(filterContext);
    }

或者创建一个操作筛选器:

public class AppVersionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(
         ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["AppVersion"] =
            GetType().Assembly.GetName()
            .Version.ToString(); // probably cached
        base.OnActionExecuting(filterContext);
    }
}

使用这个属性标记你的控制器(类)或操作(方法):

[HandleError, AppVersion]
public class HomeController : Controller
{ ... }

谢谢Marc!我知道你说的GetType()是什么意思,真没想到我就差那么一点点了!现在一切都正常了,没错,这个可能放在我的ViewData中更好,但是有了MasterPage,我该怎么做才能最好地实现呢? - GONeale
一个简单的 typeof(HomeController).GetType().Assembly.ToString() 将会揭示我正在检查 mscorlib!这是一个需要记住的事情。 - GONeale

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