MVC 3不会在区域下查找视图

时间:2011-07-20 13:50:28

标签: c# asp.net asp.net-mvc-3 asp.net-mvc-3-areas

我在MVC 3中使用了多个区域,而且我的查看无法找到问题。路由似乎正确地拾取我的控制器(所有操作都没有任何问题地执行),但是当我返回视图时MVC根本找不到它。

因此,如果我在一个名为'Some'的区域中有一个名为'Thing'的简单控制器,我会执行以下操作...

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

操作正确执行,但MVC找不到视图,我会收到类似

的消息

找不到视图'索引'或它的主人......它会显示所有搜索到的位置,这将是

〜/查看/事情/ Index.cshtml 〜/查看/共享/ Index.cshtml

等等,但它没有查看

〜/有些/查看/事情/ Index.cshtml

关于我做错的任何想法?

9 个答案:

答案 0 :(得分:17)

好的,很抱歉要回答我自己的问题,但没有人真的给了我正在寻找的答案。我的问题似乎是自定义路由。

为了重新创建问题,我创建了一个空白的MVC 3项目并添加了一个名为“Some”的区域和一个名为“Thing”的区域中的控制器。在我创建了一个只返回视图的索引操作。然后我将索引视图添加到〜/ Areas / Some / Views / Thing / Index.cshtml

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

现在去添加一个如下所示的Global.asax路径:

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

现在当我导航到/ Bob时,我得到了我提到的错误--MVC找不到视图。要解决此问题,我必须在SomeAreaRegistration类中注册此路由,而不是Global.asax。我也不需要'area'属性,所以它看起来像这样。

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

答案 1 :(得分:4)

如果您的控制器与区域名称相同,则在检查区域路径之前,您的控制器将被默认基本路由{controller}/{action}选中,因此将查找该视图在根/视图中而不是在区域/视图中。重命名区域或控制器将解决此问题。

答案 2 :(得分:1)

尝试在global.asax中添加以下路由:

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

答案 3 :(得分: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 }
        );
    }
}

答案 4 :(得分:1)

使用区域时,将index.cshtml放在〜/ Areas / Some / Views / Thing / Index.cshtml

位置

答案 5 :(得分:0)

您是否检查过(通过设置断点)是否调用了控制器方法?

您列出的搜索视图的页面不在“some”区域中。 你从哪里拨打这个链接?

如果您从其他区域或从根调用链接,则必须在操作链接中设置区域:

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

答案 6 :(得分:0)

在这里添加另一个解决方案。我也遇到了这个问题但我的问题是由于Global.asax.cs中存在冲突的“全部捕获”路径

删除此路线解决了问题。

答案 7 :(得分:0)

在RouteConfig.cs中尝试。

也许对某人会有帮助。

      routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Controllername", action = "Actionname", id = UrlParameter.Optional },
            namespaces: new [] { "Projectname.Areas.Areaname.Controllers" }

            ).DataTokens.Add("area", "Areaname");

答案 8 :(得分:-1)

它不会查看* 〜一些/ *视图.....默认情况下(我不知道你怎么能强迫它),约定会是〜/ Views / ......,这是放置视图的正确位置。如果您希望URL包含“Some”,您可以更改路由以处理该问题。