未找到“索引”视图或其主页。

时间:2010-02-15 22:00:13

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas

The view 'Index' or its master was not found. The following locations were searched:
~/Views/ControllerName/Index.aspx
~/Views/ControllerName/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx

使用ASP.Net mvc区域时出现此错误。调用区域控制器操作,但它似乎在“基础”项目视图中而不是在区域视图文件夹中查找视图。

17 个答案:

答案 0 :(得分:52)

您需要做的是为您的区域名称设置一个标记:

例如:

context.MapRoute(
        "SomeArea_default",
        "SomeArea/{controller}/{action}/{id}",
        new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
    ).DataTokens.Add("area", "YOURAREANAME");

答案 1 :(得分:28)

引发此错误的原因是您的Controller方法名称与View的名称不同。

如果你右键单击你的控制器方法并选择Go To View(Ctrl + M,Ctrl + G),它将打开一个View(成功)或抱怨它找不到一个(你看到的是什么) )。

  1. 对应的控制器和视图文件夹名称具有相同的名称。
  2. 相应的控制器方法&视图页面应该具有相同的名称。
  3. 如果您的方法名称与视图名称不同,则方法中为return view("viewName")

答案 2 :(得分:14)

Global.asax文件包含URL路由。 像这样的默认URL路由。

"{controller}/{action}/{id}"

所以,试试这个。

<强> 1。右键单击您的控制器方法,如下所示。

示例:假设我们调用Index()方法。请点击它。 enter image description here

<强> 2。单击添加视图..并给出相应的名称。在此示例中,名称应为索引。

enter image description here

然后,它将通过创建相关的文件夹结构来添加正确的视图。

答案 3 :(得分:10)

检查 MyArea AreaRegistration.cs中生成的代码,并确保将控制器参数设置为默认控制器,否则控制器将因某种原因被称为bot,ASP.NET MVC将不会在区域文件夹中搜索视图

public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "SomeArea_default",
            "SomeArea/{controller}/{action}/{id}",
            new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
        );
    }

答案 4 :(得分:5)

如果仅在部署到Web服务器时发生此错误,则问题可能是因为未正确部署视图。

如果将视图的构建操作设置为“无”而不是“内容”,则会发生这种情况的示例。

检查视图是否正确部署的方法是导航到Web服务器上站点的物理路径,并确认视图是否存在。

答案 5 :(得分:4)

问题在于我使用MvcRoute.MappUrl中的MvcContribcontext.Routes路由。

似乎MvcContrib路由映射器对区域路由感到不舒服。

答案 6 :(得分:3)

您很可能没有创建自己的视图引擎 默认视图引擎会在~/Views/[Controller]/~/Views/Shared/中查找视图。

您需要创建自己的视图引擎,以确保在区域视图文件夹中搜索视图。

看看Phil Haack的this post

答案 7 :(得分:2)

  1. 右键单击控制器中的index()方法
  2. 然后点击goto view
  3. 如果此操作打开index.cshtml?

    您的问题是IIS池无权访问视图的物理路径。

    你可以通过授权来测试它。例如: - 转到c:\inetpub\wwwroot\yourweb然后右键单击yourweb文件夹 - &gt;属性 - &gt;安全性并为每个人添加组名,并允许对您的站点进行完全控制。希望这能解决你的问题。

答案 8 :(得分:1)

在最终版本中仍然存在问题..当您从上下文菜单/添加/区域创建区域时,visual studio不要将Controller放在MapRoute方法的最后一个参数中。你需要照顾它,在我的情况下,我必须在每次创建一个新区域时手动放置它。

答案 9 :(得分:1)

今天我遇到了这个问题,一个简单的开箱即用的VS 2013 MVC 5项目手动部署到我在Windows 8上的IIS本地实例。事实证明,正在使用的App Pool没有对应用程序的正确访问权限(文件夹等)。重置我的应用程序池标识后,它运行正常。

答案 10 :(得分:0)

我将viewlocationformat添加到RazorViewEngine并为我工作。

ViewLocationFormats = new[] {
            "~/Views/{1}/{0}.cshtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Areas/Admin/Views/{1}/{0}.cshtml",
            "~/Areas/Admin/Views/Shared/{0}.cshtml"
        };

答案 11 :(得分:0)

在项目内部的Application_Start()方法中添加以下代码:

ViewEngines.Engines.Add(new RazorViewEngine());

答案 12 :(得分:0)

我在这里遇到了同样的问题,猜猜是什么....看看csproj的xml'结构,我注意到Content节点(在ItemGroup节点内)是“none”...不知道为什么但是那是我之所以得到同样的错误,只是将其编辑为“内容”作为其他错误,并且它正在发挥作用。

希望有所帮助

答案 13 :(得分:0)

如果您的MSI安装程序无法实际部署文件,则此错误也会浮出水面。

在我的情况下发生这种情况是因为我将.aspx文件转换为.cshtml文件,而visual studio认为这些是全新的文件,并将构建操作设置为none而不是内容。

答案 14 :(得分:0)

我也遇到过这个问题;我注意到我错过了将视图页面包含在名称与控制器相同的文件夹中。

控制器:adminController 视图 - &GT;管理 - &GT; view1.cshtml

(这是View-&gt; view1.cshtml)(没有文件夹:Admin)

答案 15 :(得分:0)

如果您的区域注册中所有正确的MapRoutes都可以得到此错误,并且所有其他基本配置都可以。

情况如此:

我使用了Jquery文件中的下面提到的代码来回发数据,然后从控制器操作方法加载一个视图。

$.post("/Customers/ReturnRetailOnlySales", {petKey: '<%: Model.PetKey %>'}); 

在jQuery代码之上我没有提到成功回调函数。 发生了什么事情是在完成动作方法的回发场景后,没有路由到我的预期视图,它返回到Jquery方面,并给出了上面没有找到错误的错误。

然后我提供了一个类似下面的解决方案,并且它没有任何问题。

 $.post("/Customers/ReturnRetailOnlySales", {petKey: '<%: Model.PetKey %>'},
      function (data) {
 var url = Sys.Url.route('PetDetail', { action: "ReturnRetailOnlySalesItems", controller: "Customers",petKey: '<%: Model.PetKey %>'});
 window.location = url;});   

注意:我在成功回调函数中将我的请求发送到我预期的视图操作方法。然后查看引擎找到相关区域的视图文件并正确加载。

答案 16 :(得分:0)

即使您的区域注册中包含所有正确的MapRoutes,也可能会出现此错误。尝试将此行添加到控制器操作中:

If Not ControllerContext.RouteData.DataTokens.ContainsKey("area") Then
    ControllerContext.RouteData.DataTokens.Add("area", "MyAreaName")
End If