2011-07-20 29 views
10

我在MVC 3中使用了多个区域,并且我的视图没有找到问题。路由似乎正确地拿起我的控制器(所有的动作都没有任何问题执行),但是当我返回一个视图时,MVC根本就没有找到它。MVC 3不寻找在区域下的意见

所以,如果我在一个名为“某些”的区域有一个名为“东西”简单的控制器和正确执行

public ActionResult Index() 
{ 
    return View("Index"); 
} 

动作我下面......,但MVC未找到鉴于我会得到一个消息,说像

视图“索引”或它的主人没有被发现...,它会告诉我所有的搜索位置,这将是

〜/查看/ Thing/Index.cshtml 〜/ Views/Shared/Index.cshtml

等等,等等,但它并不在

〜/一些/浏览/事/ Index.cshtml

任何的想法是什么,我做错了什么?

+0

你在正确的地方有你的地区注册文件吗? –

+0

你没有使用视图名尝试它吗?按照标准,actionmethod的名称被用作viewname。 return View(); – Tobias

回答

17

好吧,抱歉地回答我的问题,但没有人真正给我的回答我在寻找。看来我的问题是自定义路由。

为了重新创建问题,我创建了一个空白的MVC 3项目,并在该区域添加了一个名为'Some'的区域和一个名为'Thing'的控制器。在这件事上,我创建了一个索引操作,它只是返回一个视图然后,我添加了索引视图〜/ Areas/Some/Views/Thing/Index.cshtml

很好。所以当我点击/ Some/Thing/Index时,它会正确返回视图。

现在去并添加一条路线到全球。ASAX,看起来像这样:

routes.MapRoute(
       "Custom", // Route name 
       "Bob", // URL with parameters 
       new { area = "Some", controller = "Thing", action = "Index" } 
       ); 

现在,当我浏览到/鲍勃,我得到我提到的错误 - MVC没有找到视图。为了解决这个问题,我必须在SomeAreaRegistration类中而不是Global.asax中注册此路由。我也不需要'区域'属性,所以它看起来像这样。

context.MapRoute(
     "Custom", // Route name 
     "Bob", // URL with parameters 
     new { controller = "Thing", action = "Index" } 
     ); 
+4

我遇到了同样的问题,因为我尝试集中注册路由。原来我也是在RouteCollection而不是AreaRegistrationContext上调用MapRoute。 – stephen

1

尝试添加在Global.asax中以下路线:

context.MapRoute(
       "default", 
       "Some/{controller}/{action}/", 
       new { controller = "Thing", action = "Index"} 
      ); 
+0

它确实显示我对MVC路由不够了解。谢谢 –

+0

欢迎您:) –

-1

它会不会看在* 〜有些/ *浏览.....默认情况下(我不知道如何可以强制那么这个约定就是〜/ Views/......,所以这将是放置视图的正确位置。如果你希望URL包含“Some”,你可以改变路由来处理。

+1

这不可能是正确的......当您选择“添加新区域”时,它会在该区域创建“查看”文件夹? –

+0

@ AD.Net - 当涉及MVC领域时,你所说的不正确。我在〜/ Areas/Support/Views/Home/*中有意见,并且只要区域正确注册,该视图就会从该位置使用。 –

1

确保在“某些”区域有一个名为SomeAreaRegistration.cs的文件。 该文件应包含类似以下内容:

public class SomeAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Some"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Some_default", 
      "Some/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 
+0

我确实有... –

+0

我认为你应该使用** RedirectToAction(“MyAction”)**方法来显示另一个动作,而不是索引视图。如果你想返回索引,你应该只使用**返回View(); **。 –

1

使用面积,把你的index.cshtml在位置〜/地区/一些/浏览/事/ Index.cshtml

0

你检查(由设置断点)如果控制器方法被调用?

您列出视图搜索的页面不在“某些”区域。 从哪里打电话给该链接?

如果从另一个地区或从根调用链接,您必须设置区域的操作链接:

@Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null) 
+0

是的,我做了 - 它绝对是控制器 –

0

只是在这里添加另一种解决方案。我也有这个问题,但我的是由于在Global.asax.cs中有一个冲突的“全部捕捉”路线

删除此路径修复了问题。

4

如果您控制器具有相同的名称作为区域,控制器将被默认的基本路线{controller}/{action}被拾起之前,它会检查该区域的路线,因此将寻找根/视图的视图,而不是在区域/视图。重命名区域或控制器将解决此问题。

+0

将AreaRegistration中的路由更改为专门包含控制器的名称也将解决问题,而无需重命名控制器。 –