razor views are not giving compile time error

28,699

Solution 1

When i try to build my MVC4 Web Project. It doesn't recognize error in razor view when i do "Build" or "Re-Build".

Seems normal. Razor views are dynamically compiled by the ASP.NET runtime. If you want your views to be built at compile-time you could add the following option to your .csproj file:

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

You may take a look at the this article for more details.

Solution 2

I recommend you to add MmvcBuildViews tag as a child of the Release PropertyGroup tag so the views are only compiled when you compile in Release mode (or when you publish in Release mode). This way, your app is faster when you are debugging. And, you get compile-time checks before deploying (when you build on Release mode). In summary, you get the best of both worlds.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <MvcBuildViews>true</MvcBuildViews>
  </PropertyGroup>

Solution 3

According to my experience, besides the true setting mentioned above, you still need to ensure below setting exist in your csproj file:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

Solution 4

By default it does not compile views. You can enable this feature, but keep in mind that it will increase build time.

You can enable compiling view by following these steps:

  • Unload project
  • Open project file
  • Find <MvcBuildViews>false</MvcBuildViews> and change it to have true
  • Close project file and reload project

Solution 5

Its really Very Simple Answer Go through this Steps:

Unload Project

Edit Project

Than Search :

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

below add

<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'">
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>

That's it Than Unload Project . Build

And Check Ur Syntax Is work properly .

I am Sure.

Share:
28,699
Amit Andharia
Author by

Amit Andharia

ASP.NET|MVC|Razor|Entity Framework|MS SQL Server Expert Core Area Of Expertise includes ASP.NET, MVC, Razor,Entiry Framework, SilverLight, WCF, C#.NET, VB.NET, MS SQL Server, MySQL, PostGreSQL, MS Access,XML HTTP, ASP.NET AJAX Control ToolKit, jQuery, Linq to sql, Enterprise Library, jQuery, JSON, JavaScript, N-Tier Architecture, Three Tier, MVVM, &amp; Microsoft Design Patterns

Updated on July 09, 2022

Comments

  • Amit Andharia
    Amit Andharia almost 2 years

    I've recently installed VS 2012 Professional.

    When i try to build my MVC4 Web Project. It doesn't recognize error in razor view when i do "Build" or "Re-Build".

    Example :
    I removed a namespace from the project / or say renamed it. i build the solution, it gave me errors in all cs files, which i fixed by changing the namespace. The entire solution build successfully. When i run the project it gave me Compilation Error saying that namespace not found, because the old namespace was still referred in some of the views (*.cshtml files).

    Expected Solution :
    I wish when i do "Build" or "Re-Build", it should recognize such errors and show me along with any other errors.

    This was working fine with VS 2010, am i missing any configuration?

    Thanks In Advance !! Amit

    Edit I found the answer myself, i think it was early to post the question :

    razor syntax with errors compiles when it should not compile

    Another Problem

    After changing value to True in .csproject file, when i start building the project it shows error, but it shows only one error at a time. let's say, i've 5 errors in total 3 views. it would just show me one error. Is there any solution so that it shows all the 5 errors ?

  • Maris
    Maris about 11 years
    Usefull information. Thx
  • elranu
    elranu almost 11 years
    @Darin Dimitrov this will make execution faster? at least the first time?
  • Darin Dimitrov
    Darin Dimitrov almost 11 years
    @elranu, yeah the first request after the application pool has been restarted might be very slightly faster but the difference might not even be noticeable. The real benefit of precompiling the Razor views is not performance but the compile-time safety that you get during development.
  • Francisco Goldenstein
    Francisco Goldenstein almost 10 years
    I don't recommend using this tag in debug mode because every time you run the app, the views have to be compiled (making it slower) and you cannot make a change in a view unless you stop the app. Take a look at my answer to see how you can get compile-time check in views and at the same time be able to edit views. stackoverflow.com/a/24665580/754049
  • Admin
    Admin almost 10 years
    With MvcBuildViews = true, you can still edit views and press F5 to see changes immediately.
  • Francisco Goldenstein
    Francisco Goldenstein almost 10 years
    You're right, thanks. I have just edited my answer.
  • Korijn
    Korijn over 9 years
    From the linked thread, by @buffjape: "With MvcBuildViews = true, you can still edit views and press F5 to see changes immediately."
  • Omid-RH
    Omid-RH almost 8 years
    for me, this was complete answer. thanks
  • ransems
    ransems about 2 years
    AspNetCompiler MSBuild can do AfterBuild to the bin folder. Local build bin folder is in source tree. TFS Teambuild compiles to a different dir on build server. AspNetCompiler task needs to find bin directory to ref the required DLL. Solution is to modify the AfterBuild target of the MVC Project needs 2 entries Then you compile at local as well as TFS.
  • ransems
    ransems about 2 years
    <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" /> <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(PublishDir)_PublishedWebsites\$(ProjectName)‌​" /> </Target>
  • ransems
    ransems about 2 years
    Also added: <PropertyGroup> <MvcBuildViews>true</MvcBuildViews> </PropertyGroup>