C# MVC 3不在区域下查找视图

C# MVC 3不在区域下查找视图,c#,asp.net,asp.net-mvc-3,asp.net-mvc-3-areas,C#,Asp.net,Asp.net Mvc 3,Asp.net Mvc 3 Areas,我在MVC 3中使用了多个区域,但我的视图找不到。路由似乎正确地选择了我的控制器(所有操作都在执行,没有任何问题),但当我返回视图时,MVC根本找不到它 所以如果我在一个叫做“Some”的区域中有一个叫做“Thing”的简单控制器,我会执行以下操作 public ActionResult Index() { return View("Index"); } 该操作执行正确,但MVC找不到该视图,我将收到一条消息,内容如下 找不到视图“索引”或其主视图。。。它将显示所有搜索到的位置,这些位

我在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


有没有关于我做错了什么的想法?

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

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

它不会出现在*~某些/*视图中。。。。。默认情况下(我也不知道如何强制),约定是~/Views/…,因此这是放置视图的正确位置。如果您希望URL包含“Some”,您可以更改路由以处理该问题

确保您的“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 }
        );
    }
}

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

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

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

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

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

好的,很抱歉必须回答我自己的问题,但是没有人真正给我我想要的答案。看来我的问题是自定义路由

为了重现这个问题,我创建了一个空白的MVC3项目,并在该项目中添加了一个名为“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中注册这个路由。我也不需要“区域”属性,所以它看起来像这样

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

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


删除此路由解决了此问题。

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

在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");

您的区域注册文件放在正确的位置了吗?您在没有viewname的情况下尝试过吗?根据标准,actionmethod的名称用作viewname。返回视图();那不可能是对的。。。当您选择“添加新区域”时,它会在区域中创建“查看”文件夹?@AD.Net-当涉及MVC区域时,您所说的不正确。我在~/Areas/Support/views/Home/*中有视图,只要区域注册正确,视图就可以从该位置使用。看来我对MVC路由的了解还不够。谢谢,我认为您应该使用RedirectToAction(“MyAction”)方法来显示另一个操作,而不是索引视图。如果要返回到索引,应仅使用return View();。是的,我做到了-这肯定是对控制员的打击。我也有同样的问题,因为我试图集中我的路线登记。原来我也在RouteCollection而不是AreaRegistrationContext上调用MapRoute。将AreaRegistration中的路由更改为专门包含控制器名称也可以解决问题,而无需重命名控制器。