视图或其主控未找到,或没有视图引擎支持搜索的位置。

91
视图“LoginRegister”或其母版找不到,或没有视图引擎支持搜索的位置。已搜索以下位置: ~/Views/MyAccount/LoginRegister.aspx ~/Views/MyAccount/LoginRegister.ascx ~/Views/Shared/LoginRegister.aspx ~/Views/Shared/LoginRegister.ascx ~/Views/MyAccount/LoginRegister.cshtml ~/Views/MyAccount/LoginRegister.vbhtml ~/Views/Shared/LoginRegister.cshtml ~/Views/Shared/LoginRegister.vbhtml
实际上,我的页面视图页面是~/Views/home/LoginRegister.cshtml,那我该怎么办呢?
我的RouteConfig如下:
 public class RouteConfig
    {

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "MyAccount", action = "LoginRegister", id = UrlParameter.Optional }
            );
        }
    }

将LoginResiter视图移动到正确的文件夹中(用于MyAccount控制器)。 - Mansfield
控制器?但我的页面是视图。 - user2564537
2
ASP.NET MVC期望特定控制器的视图位于共享文件夹或具有控制器名称的文件夹中。正如您所看到的,它正在查找“MyAccount”文件夹和“Shared”文件夹。如果您想在控制器中使用视图,则应将其放置在具有该控制器名称的文件夹中。这与您的路由配置无关。 - Mansfield
8
将网站发布到另一台计算机后,我收到了这个错误。事实证明,视图上的“Build action”被设置为“None”,而不是“Content”,所以将其切换并重新发布(或只需复制文件)即可解决问题。 - Patrick
2
可能是重复的问题:The view 'Index' or its master was not found. - Elshan
如果您确定视图在它应该在的位置,您可以尝试将 "optimizeCompilations" web.config 键设置为 false 进行重建。 - Taraz
15个回答

128

如果您的模型类型是String,请注意,View(string, string)的第二个参数是masterName,而不是model。您可能需要调用具有对象(model)作为第二个参数的重载:

不正确的:

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",msg);
}

正确的:

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",(object)msg);
}

OR(由bradlis7提供):

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",model:msg);
}

20
不要使用(object)msg进行强制转换,而是直接指定参数:return View("Message", model: msg); - bradlis7
1
这是一个很棒的答案。 - JsonStatham
1
这句话“如果你的模型类型是字符串,请小心,因为View(string, string)的第二个参数是masterName,而不是model。” 真的帮了我大忙!谢谢! 你只用了10秒钟就解决了让我烦恼了半个小时的问题! - Vitox

32
问题:

无法在默认位置找到您的View

解释:

View应该与Controller同名并位于相同的文件夹中,或者位于Shared文件夹中。

解决方案:

要么将您的View移动到MyAccount文件夹中,要么创建一个HomeController

替代方法:

如果您不想移动View或创建一个新的Controller,可以查看此链接


8
此外,如果您遇到了我发现的这个问题,最好的方法就是删除您的视图(将其内容复制到记事本++中)。进入您的控制器,右键单击您的ActionResult,选择生成视图,然后您可以看到您的控制器正在寻找您的视图并相应地放置您的视图。 - Bill Blankenship

14
在Microsoft ASP.net MVC中,路由引擎用于解析进出URL组合,并设计了约定优于配置的思想。这意味着如果您遵循路由引擎使用的约定(规则),您就不必更改配置。
ASP.net MVC的路由引擎不提供Web页面(.cshtml)。它提供了一种处理URL的方法,使其由您代码中的类处理,该类可以将文本/ HTML呈现到输出流中,或者使用约定以一致的方式解析和提供.cshtml文件。
用于路由的约定是将控制器与名称类似于ControllerNameController的类匹配,即controller="MyAccount"表示查找名为MyAccountController的类。接下来是操作,它被映射到控制器类中的一个函数,该函数通常返回ActionResult。例如,action="LoginRegister"将查找控制器类中的public ActionResult LoginRegister(){}函数。该函数可能返回一个View(),其约定名称为LoginRegister.cshtml,并存储在/ Views / MyAccount /文件夹中。
总之,您将有以下代码:

/ Controllers / MyAccountController.cs:

public class MyAccountController : Controller 
{
    public ActionResult LoginRegister()
    {
        return View();
    }
}

/Views/MyAccount/LoginRegister.cshtml: 您的视图文件。


11
在您的LoginRegister操作中返回视图时,请执行以下操作。我知道这可以在MVC 5中完成,但不确定在MVC 4中是否也可以。
 public ActionResult Index()
 {
     return View("~/Views/home/LoginRegister.cshtml");
 }

6

请检查您的视图(.cshtml文件)的构建操作,它应该设置为内容。在某些情况下,我曾经看到构建操作被错误地设置为无(None),即使您在有效文件夹下的Visual Studio项目文件中看到该视图,但此特定视图也未部署到目标计算机上。


2
在我的情况下,这也与“生成操作”属性有关,但我需要将其设置为“嵌入式资源”。 - Ali Tahouri
谢谢,这就是我需要的。 - blackorchid

3

这可能是一个权限问题。

最近我也遇到过相同的问题。作为测试,我创建了一个简单的hello.html页面。当我尝试加载它时,出现了与权限有关的错误消息。一旦我在根Web文件夹中解决了权限问题,HTML页面和MVC渲染问题都得到了解决。


在我的情况下,这也是权限问题,允许经过身份验证的用户访问应用程序的根文件夹,并移除只读标志即可解决该问题。 - Momin

2

我因为重命名了视图(和POST动作)而遇到了这个错误。

最终我发现我忘记将BOTH GET和POST动作重命名为新名称。

解决方案:将BOTH GET和POST动作重命名为与视图名称匹配的名称。


2

请检查您创建的视图(.ASPX文件)是否与控制器中提到的名称相同。例如:

 public ActionResult GetView()
 {
    return View("MyView");
 }

在这种情况下,应该将aspx文件的名称更改为MyView.aspx,而不是GetView.aspx。

1
我遇到了同样的问题。我复制了一个名为“电影”的视图,并相应地将其重命名为“客户”。我也在模型和控制器中做了同样的事情。
解决方法是...我将“客户”视图重命名为“Customer1”,然后创建了一个新视图并将其命名为“Customer”...然后我只需将“Customer1”代码复制到“Customer”中即可。
这个方法有效。
我很想知道问题的真正原因。
更新:仅供娱乐...我回去再次复制了所有重命名场景...没有任何错误。

1
我发现这个错误是由于语句未正确关闭造成的。
@using (Html.BeginForm("DeleteSelected", "Employee", FormMethod.Post))

{

} //这个花括号需要在最后关闭。

在 Index.cshtml 视图文件中,我没有在程序的结尾处正确关闭语句,而是不当地关闭了它并遇到了这个错误。

我确信没有必要检查 Controller ActionMethod 代码,因为我已经将控制器方法正确返回到视图。所以问题肯定出在视图上,导致出现类似的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接