Namespaces in Inherited Web.config ignored during Razor compilation
I have a Sitefinity project using MVC4 with inherited web.config files in subfolders of the root Views folder that import namespaces specific to a controller's models. This was working before and I don't know what changed, but it isn't working anymore and I'm left scratching my head. The setup is something like:
-Mvc
- Views
- MyController
- MyView.cshtml
- Web.Config
Then in the web.config I have:
<?
xml
version
=
"1.0"
?>
<
configuration
>
<
configSections
>
<
sectionGroup
name
=
"system.web.webPages.razor"
type
=
"System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
>
<
section
name
=
"host"
type
=
"System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
requirePermission
=
"false"
/>
<
section
name
=
"pages"
type
=
"System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
requirePermission
=
"false"
/>
</
sectionGroup
>
</
configSections
>
<
system.web.webPages.razor
>
<
host
factoryType
=
"System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
/>
<
pages
pageBaseType
=
"System.Web.Mvc.WebViewPage"
>
<
namespaces
>
<
add
namespace
=
"MyController.Models"
/>
</
namespaces
>
</
pages
>
</
system.web.webPages.razor
>
<
appSettings
>
<
add
key
=
"webpages:Enabled"
value
=
"false"
/>
</
appSettings
>
<
system.webServer
>
<
handlers
>
<
remove
name
=
"BlockViewHandler"
/>
<
add
name
=
"BlockViewHandler"
path
=
"*"
verb
=
"*"
preCondition
=
"integratedMode"
type
=
"System.Web.HttpNotFoundHandler"
/>
</
handlers
>
</
system.webServer
>
</
configuration
>
@model MyModel
class MyController.Models.MyModel
But when I compile the project and request that page, I get an exception:
Type : System.Web.HttpCompileException, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Message : e:\TEMP\vs\35d89ea4\b5299118\App_Web_index.cshtml#mylayout.cshtml.11a9a948.9b5ebqbf.0.cs(160): error CS0246: The type or namespace name 'MyModel' could not be found (are you missing a using directive or an assembly reference?)
Source : System.Web
Help link :
Results : System.CodeDom.Compiler.CompilerResults
SourceCode :
WebEventCode : 0
ErrorCode : -2147467259
Data : System.Collections.ListDictionaryInternal
TargetSite : System.CodeDom.Compiler.CompilerResults Compile()
HResult : -2147467259
Stack Trace : at System.Web.Compilation.AssemblyBuilder.Compile()
at System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
at System.Web.Compilation.BuildManager.GetObjectFactory(String virtualPath, Boolean throwIfNotFound)
at System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath)
at System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext, String virtualPath)
at System.Web.Mvc.VirtualPathProviderViewEngine.<>c__DisplayClass4.<
GetPathFromGeneralName
>b__0(String path)
at System.Web.WebPages.DefaultDisplayMode.GetDisplayInfo(HttpContextBase httpContext, String virtualPath, Func`2 virtualPathExists)
at System.Web.WebPages.DisplayModeProvider.<>c__DisplayClassb.<
GetDisplayInfoForVirtualPath
>b__8(IDisplayMode mode)
at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at System.Web.WebPages.DisplayModeProvider.GetDisplayInfoForVirtualPath(String virtualPath, HttpContextBase httpContext, Func`2 virtualPathExists, IDisplayMode currentDisplayMode, Boolean requireConsistentDisplayMode)
at System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName(ControllerContext controllerContext, List`1 locations, String name, String controllerName, String areaName, String cacheKey, String[]& searchedLocations)
at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations)
at System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache)
at System.Web.Mvc.ViewEngineCollection.<>c__DisplayClassc.<
FindView
>b__b(IViewEngine e)
at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths)
at System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext, String viewName, String masterName)
at System.Web.Mvc.ViewResult.FindView(ControllerContext context)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<
InvokeActionResultWithFilters
>b__17()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<>c__DisplayClass1c.<
InvokeActionResultWithFilters
>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<>c__DisplayClass1c.<
InvokeActionResultWithFilters
>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<>c__DisplayClass1c.<
InvokeActionResultWithFilters
>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<>c__DisplayClass1c.<
InvokeActionResultWithFilters
>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<>c__DisplayClass1c.<
InvokeActionResultWithFilters
>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
at Telerik.Sitefinity.Mvc.ControllerWrapper.Execute()
at Telerik.Sitefinity.Mvc.ControllerActionInvoker.ExecuteController(MvcProxyBase proxyControl)
at Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Routing.DynamicUrlParamActionInvoker.ExecuteController(MvcProxyBase proxyControl)
If I add the Razor using statement (@using MyController.Models) at the head of the view, it's all gravy. I was just trying to avoid doing that in every view file.
What could have possibly happened to cause this to stop working? And how do I fix it? There are other developers working on the project as well, but after diffing through revision history nothing really seems to be any different. I'm at a loss.
Does anyone have any ideas? I don't know if this is a Sitefinity issue or not, but I've never run into anything like this before.
Hello Richard,
Did you manage to solve the issue?
Can you try to clear the Visual Studio cache and the asp.net temp files and that try to build your solution again?
Regards,
Svetoslav Manchev
Telerik
No, I was not able to fix this issue. I have cleared the generated ASP.NET temp files to no avail. I cleared the VS cache and am still facing the same issue. Sorry, no dice.
As a word of caution to anyone stumbling across this post, clearing the VS cache may have some very unfortunate side effects if you aren't prepared:
"The side effects are that your personal environment resets to default and many, if not all, the Visual Studio extension have to be re-installed. The worst side effect, unless you are Swiss and keep everything documented to the nth degree, is that the Team Foundation Server and Collection configuration evaporates during the user data reset."
From: If you have problems with TFS or Visual Studio flush the user cache … or not?
Just remember to export your IDE settings first.
This issue has been reproduced and appears to be an issue in Feather.
See the related GitHub issue here: Namespaces in Inherited Web.config ignored during Razor compilation #2190