我在我的MVC 3应用程序中创建了一个名为“Blog”的区域。
在global.asax中,我有以下代码。
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);
}
这是我的区域代码
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 }
);
}
}
当我转到以下网址http://localhost/CMS/blog时,我收到以下错误。
未找到视图“索引”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置: 〜/查看/博客/的Index.aspx 〜/查看/博客/ Index.ascx 〜/查看/共享/的Index.aspx 〜/查看/共享/ Index.ascx 〜/查看/博客/ Index.cshtml 〜/查看/博客/ Index.vbhtml 〜/查看/共享/ Index.cshtml 〜/查看/共享/ Index.vbhtml
我该如何解决这个问题?
答案 0 :(得分:26)
我找到了我认为是框架中的错误,并找到了解决方法。如果您尝试将默认路由映射到具有区域的MVC 3应用程序,则您的global.asax文件可能具有以下内容:
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 }
);
如果您转到URL中的应用程序根目录,则可能会出现如下运行时错误:
未找到“索引”视图或其主视图,或者视图引擎不支持搜索的位置。搜索了以下位置:
由于某种原因,视图引擎似乎没有在视图文件的区域文件夹中查找,就像在整个链接中键入一样。奇怪的是代码到达控制器动作。以下是修复:将此代码放入控制器操作中:
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")
}
答案 1 :(得分:8)
您所在地区的注册似乎有误。您为操作指定了默认值,但没有为控制器指定默认值。由于您通常将Home作为控制器的名称,因此您需要指定它。
此外,您可能没有正确设置文件夹,因为您应该进行物理设置:
...一旦您修复了博客区域路线,您还需要:
你得到的错误似乎非常清楚地表明这是问题所在。
答案 2 :(得分:3)
我正在使用Phil Haack的routedebugger来解决这个问题。它可以方便地显示所有已注册的路由以及输入的URL如何与您的配置匹配。
它通过覆盖常规应用程序流来实现,您可以通过在Application_Start末尾添加此行来启用它:
RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );
答案 3 :(得分:3)
放松!这可以节省您的阅读时间,制作咖啡并观看这个3分钟的视频,一切都将清晰。 http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas(我相信它也适用于mvc3,mvc4和mvc2035)
答案 4 :(得分:2)
从Mortens answer开始,您现在可以NuGet(或手动下载并安装)提供此功能的RouteMagic或Glimpse个套件,等等。
Phil Haacks blog提供了有关其工具状态及其变形内容的更多信息。这些评论也很好用!
答案 5 :(得分:0)
检查您是否将虚拟路径映射为区域名称。我在visual studio中设置区域地址只是为了调试,它让我创建一个虚拟路径。所以AppRelativeCurrentExecutionFilePath总是〜/并且路由无法确定区域。对于IIS express,删除站点的虚拟路径:
C:\Users\username\Documents\IISExpress\config\applicationhost.config
我花了4天的时间来发现它。
答案 6 :(得分:0)
我遇到了与Mindstorm Interactive相同的问题,采取了略微不同的方法。是的,它确实重定向了用户,但它使我的代码看起来不那么麻烦。
我创建了一个新的控制器,无论在哪个区域,因为问题是在渲染器内找不到视图,而不是控制器。
控制器然后重定向包含的区域(如在Mindstroms修复,键中),并且瞧。
public class StartController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Index", "MyController", new { area = "MyArea" });
}
}
在RouteConfig中添加
routes.MapRoute(name: "Root", url: "", defaults: new { controller = "Start", action = "Index", area = "MyArea" });
希望它有所帮助。
答案 7 :(得分:0)
尝试从here提及的以下目录中删除内容并重建项目
C:\ Temp C:\ Users \%用户名%\ 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 文件路径\到\ Your \ Project \ obj \ Debug