可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I created a Area in my MVC 3 application called 'Blog'.
In global.asax I have the following code.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
This is the code of my Area
public class BlogAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Blog"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Blog_default",
"Blog/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
When I go to the following url http://localhost/CMS/blog I get the following error.
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/blog/Index.aspx
~/Views/blog/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/blog/Index.cshtml
~/Views/blog/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
How do I solve this?
回答1:
The registration in your area appears to be wrong. You specify a default for your action but not for the controller. Since you typically have Home as the name of the controller you'd need to specify that.
Also it could be you don't have your folders setup correctly since you should have physically setup:
- /Areas/Blog
- /Areas/Blog/Controllers
- /Areas/Blog/Views
... and once you have fixed your blog area route you'll also need:
- /Areas/Blog/Views/Home << Put your index view in here
The error you get seems to pretty clearly indicate this is the issue.
回答2:
I found what I consider to be a bug in the framework, with a workaround. If you are trying to map a default route to an MVC 3 app with areas, your global.asax file might have something like this:
VB:
routes.MapRoute(
"Default",
"{area}/{controller}/{action}/{id}",
New With {.area = "MyArea", .controller = "Home", .action = "Index", .id = UrlParameter.Optional}
)
C#:
routes.MapRoute(
"Default",
"{area}/{controller}/{action}/{id}",
new { area = "MyArea", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
If you go to your app root in the URL, you may get a runtime error like this:
The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
For some reason, the view engine does not appear to look in the area folder for the view file the same as if you type in the whole link. The strange thing is the code reaches the controller action. Here is the fix: Put this code in your controller action:
VB:
If Not Me.ControllerContext.RouteData.DataTokens.ContainsKey("area") Then
Me.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
End If
C#
if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
{
this.ControllerContext.RouteData.DataTokens.Add("area", "MyArea")
}
回答3:
I'm using Phil Haack's routedebugger to troubleshoot problems such as this one. It conveniently shows all registered routes and how the entered URL matches your configuration.
It works by overriding the regular application flow, which you enable by adding this line at the end of Application_Start:
RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );
回答4:
Relax! This can save you hours of reading, make a coffee and watch this 3 minutes video, everything will be clear to you. http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas (I belive it also works for mvc3, mvc4, and mvc2035)
回答5:
Following on from Mortens answer, you can now NuGet (or manually download and install) the RouteMagic, or Glimpse packages which provides this functionality, and more.
More information is available on Phil Haacks blog regarding the state of his tool and what it has morphed into. The comments make for good reading too!
回答6:
Check if you have a virtual path is mapped as the area name. I set area address in visual studio just to debug and it asked me to create a virtual path. So AppRelativeCurrentExecutionFilePath was always ~/ and routing wasn't able to determine the area. For IIS express delete the virtual path for your site:
C:\Users\username\Documents\IISExpress\config\applicationhost.config
I spent 4 days to discover it.
回答7:
I had the same issue as Mindstorm Interactive, and took a slightly different approach. Yes, it does redirect the user, but it made my code look less workaroundy so to speak.
I created a new controller, no matter in what area, since the problem is within the renderer not finding the view, not the controller.
The controller then redirects with the area (as in Mindstroms fix, the key) included, and voila.
public class StartController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Index", "MyController", new { area = "MyArea" });
}
}
in the RouteConfig just add
routes.MapRoute(name: "Root", url: "", defaults: new { controller = "Start", action = "Index", area = "MyArea" });
Hope it helps someone.
回答8:
Just try to delete content from following directories as mentioned here and rebuild project
C:\Temp C:\Users\%Username%\AppData\Local\Microsoft\VisualStudio
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files Path\To\Your\Project\obj\Debug