11

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

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

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

动作正确执行,但 MVC 找不到视图,我会收到一条消息,说类似

未找到视图“索引”或其主视图...它会向我显示所有搜索到的位置,这将是

~/Views/Thing/Index.cshtml ~/Views/Shared/Index.cshtml

等等等等,但它不看

~/Some/Views/Thing/Index.cshtml

关于我做错了什么的任何想法?

4

9 回答 9

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" }
        );
于 2011-07-21T10:15:37.143 回答
4

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

于 2012-11-14T02:10:48.127 回答
1

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

 context.MapRoute(
                "default",
                "Some/{controller}/{action}/",
                new { controller = "Thing", action = "Index"}
            );
于 2011-07-20T13:59:28.193 回答
1

确保在“Some”区域中有一个名为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 }
        );
    }
}
于 2011-07-20T14:18:33.610 回答
1

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

于 2011-07-20T22:54:52.667 回答
0

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

您列出的搜索视图的页面不在“某些”区域中。你从哪里调用链接?

如果您从另一个区域或从根调用链接,则必须在操作链接中设置该区域:

 @Html.ActionLink("Go To Some/Thing", "Index", "Thing", new {area="Some"}, null)
于 2011-07-21T07:21:33.070 回答
0

只是在这里添加另一个解决方案。我也遇到了这个问题,但我的问题是由于 Global.asax.cs 中的“catch all”路线冲突

删除这条路线解决了这个问题。

于 2012-03-27T09:40:29.190 回答
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");
于 2020-06-11T15:25:07.490 回答
-1

默认情况下它不会在 * ~Some/ *Views ..... d 是放置视图的正确位置。如果您希望 URL 包含“Some”,您可以更改路由来处理它。

于 2011-07-20T13:59:37.117 回答