djack109
djack109

Reputation: 1377

How do I stop MVC5 RenderAction looking for .aspx files

I added MVC to my existing webforms project. All is going well except for RenderAction is looking for .aspx files

The view '_Mainmenu.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched:

~/Areas/NewPages/Views/Shared/_Mainmenu.cshtml.ascx

The view is

~/Areas/NewPages/Views/Shared/_Mainmenu.cshtml

And it does exist in that folder. Can anybody help me sort this out. Everything else MVC is working OK I even have PITA EntityFramework working too

Any help would be appreciated

Upvotes: 4

Views: 585

Answers (2)

mis2000lab
mis2000lab

Reputation: 39

In the "Global.asax" file, find "Application_Start()"

Then, Please input this code --

RemoveWebFormEngines();

Upvotes: -1

Tetsuya Yamamoto
Tetsuya Yamamoto

Reputation: 24957

The view '[viewname]' or its master was not found or no view engine supports the searched locations indicates that you're using default view engine which prioritizes web forms view engine (the path shown as ~/Areas/NewPages/Views/Shared/_Mainmenu.cshtml.ascx means that MVC view engine prioritizes searching ASPX & ASCX files instead of Razor cshtml files). To change this behavior which MVC uses Razor view engine by default, insert these lines into Application_Start method on Global.asax:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
// ViewEngines.Engines.Add(new WebFormViewEngine()); => optional webforms engine registration

Additionally, if default Razor view engine still can't recognize cshtml files in areas properly, you need to create a custom view engine class which inherits RazorViewEngine and setting AreaViewLocationFormats in its constructor like this:

public class CustomViewEngine : RazorViewEngine
{
    public CustomViewEngine()
    {
        // Route parsing convention for view engines:
        // {0} means action method name
        // {1} means controller class name
        // {2} means area name

        AreaMasterLocationFormats = new[] 
        {
            "~/Areas/{2}/Views/Shared/{0}.cshtml"
        };

        AreaViewLocationFormats = new[] 
        {
            "~/Areas/{2}/Views/{1}/{0}.cshtml",

            // other view search locations here
        };

        AreaPartialViewLocationFormats = AreaViewLocationFormats;
    }
}

Note that the custom view engine will search all view pages inside areas specified by controller action method depending on routes defined in AreaViewLocationFormats.

Then, register custom view engine class at the same place as RazorViewEngine, i.e. in Global.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // clear all view engines repository first
    ViewEngines.Engines.Clear();

    // register Razor view engine only
    ViewEngines.Engines.Add(new RazorViewEngine());

    // register custom view engine class here
    ViewEngines.Engines.Add(new CustomViewEngine());

    // other initialization codes here
}

Similar issues:

ASP.NET MVC: When should I create custom View Engine

How do I implement a custom RazorViewEngine to find views in non-standard locations?

Upvotes: 2

Related Questions