7

Strange one here. My MVC Web Application's version number is not printing correctly to my view according to what is set in AssemblyInfo.cs. The definition I have set in set AssemblyInfo.cs is '1.0.232.0'.

I have tried multiple methods in order to print it:

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

(results 0.0.0.0)

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

(results in 2.0.0.0, which is set nowhere in my project.)

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

(results in 2.0.0.0)

This leads me to believe that it simply must not be picking up my AssemblyInfo.cs file? This is also the case if I attempt to use the "Publish" button to publish to IIS on our development server.

Any ideas? Perhaps I'm using the wrong statement to fetch the version number? :\

Thanks guys.

0

1 Answer 1

13

The view is (by default) still largely compiled on-demand, so you con't reliably use GetExecutingAssembly() within the view - however, for me the controller usage works fine:

[assembly: AssemblyVersion("1.2.3.4")]

with:

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

shows

1.2.3.4

in the page.

edit The mistake you made was calling typeof(...).GetType() - that is going to give you Type (or a subclass) - so yes, it will be 2.x. /edit

For the extra step of pre-compiling the views, see "MSBuild Task for Compiling Views" here.

Arguably, your view shouldn't be fetching this data itself anyway - it should be put into the ViewData (or similar), perhaps by a base-controller or action-filter.


Re the question about master pages; first, pick a key ;-p

<%=ViewData["AppVersion"] %>

then two options leap to mind: override OnActionExecuting in the controller (or a common base-controller):

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

or create an action-filter:

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

And mark your controllers (classes) or actions (methods) with this attribute:

[HandleError, AppVersion]
public class HomeController : Controller
{ ... }
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks Marc! I know what you mean about GetType(), Darn to think I was that close! All working now and yes arguably it could be in my ViewData, however with a MasterPage how best could I achieve this?
A simple typeof(HomeController).GetType().Assembly.ToString() would have revealed I was inspecting mscorlib! That will be one to keep in mind.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.