MVC 3不在Area下查找视图。

问题描述 投票:10回答:9

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

因此,如果我在一个叫做 "Some "的区域有一个叫做 "Thing "的简单控制器,并且我做了以下操作......

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

动作被正确执行,但是MVC没有找到视图,我会得到一个类似于这样的消息。

视图 "索引 "或它的主视图没有找到...... 它将显示我所有搜索的位置,这将是

~ViewsThingIndex.cshtml~ViewsSharedIndex.cshtml。

等等,但看起来并不在。

~SomeViewsThingIndex.cshtml。

有什么想法,我做错了什么?

c# asp.net asp.net-mvc-3 asp.net-mvc-3-areas
9个回答
17
投票

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

为了重新创建这个问题,我创建了一个空白的MVC 3项目,并添加了一个名为 "Some "的区域和一个名为 "Thing "的控制器。 在thing上,我创建了一个Index动作,它只是返回一个视图。 然后我将Index视图添加到~AreasSomeViewsThingIndex.cshtml中。

很好,所以当我点击SomeThingIndex时,它能正确地返回视图。 所以当我点击SomeThingIndex时,它正确地返回了视图。

现在去给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" }
        );

4
投票

如果你的 控制器与区域名称相同您的控制器将被默认的基本路由所接收。{controller}/{action} 在它检查区域路径之前,因此会在根视图中寻找视图,而不是在区域视图中。重命名区域或控制器可以解决这个问题。


1
投票

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

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

1
投票

确保你有一个名为 在你的 "Some "区域上的SomeAreaRegistration.cs 在你的 "Some "区域上,这个文件应该包含如下内容。

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 }
        );
    }
}

1
投票

当使用区域时,把你的index.cshtml放在~AreasSomeViewsThingIndex.cshtml的位置。


0
投票

你有没有检查(通过设置断点)控制器方法是否被调用?

你列出的搜索视图的页面不在 "some "区域内.你从哪里调用链接?

如果你从其他区域或从根部调用链接,你必须在动作链接中设置区域。

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

0
投票

我想在这里补充一个解决方案 我也遇到了这个问题,但我的问题是由于Global.asax.cs中的 "catch all "路由有冲突。

删除这个路由后,问题就解决了。


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

-1
投票

在*中看不出来~一些*Views......默认情况下(我也不知道你怎么能强行这么做),惯例是~Views......,所以这才是正确的放置视图的地方。如果你想让URL包含 "Some",你可以改变路由来处理。

© www.soinside.com 2019 - 2024. All rights reserved.