找不到视图或其主视图,或者没有视图引擎支持搜索到的位置


80

错误,例如:找不到视图'LoginRegister'或其主视图,或者没有视图引擎支持搜索到的位置。搜索了以下位置:

〜/ Views / MyAccount / LoginRegister.aspx

〜/ Views / MyAccount / LoginRegister.ascx

〜/视图/共享/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控制器)。
曼斯菲尔德

控制器?但是我的页面是视图
user2564537

2
ASP.NET MVC希望特定控制器的视图位于共享文件夹或具有控制器名称的文件夹中。如您所见,它正在“ MyAccount”文件夹和“ Shared”文件夹中查找。如果要在控制器中使用视图,则应将其放在具有该控制器名称的文件夹中。它与您的路由配置无关。
曼斯菲尔德

8
将网站发布到另一台计算机后,我收到此错误。原来,将视图上的Build操作设置为,None而不是Content切换它们并重新发布(或仅复制文件)起作用。
Patrick

Answers:


106

如果您的模型类型是String,请小心因为View(string,string)的第二个参数是masterName,而不是model。您可能需要使用object(model)作为第二个参数来调用重载:

不正确 :

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

正确的:

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

或(由bradlis7提供):

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

16
除了强制转换外(object)msgreturn View("Message", model: msg);
还应

1
这是一个很好的答案
JsonStatham

31

问题:

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

说明:

视图应位于名为Controller或的Shared文件夹中。

解:

将您View移至该MyAccount文件夹或创建一个HomeController

备择方案:

如果您不想移动View或创建新文件Controller,可以在此链接处进行检查。


3
另外,如果您遇到我发现的问题,最好删除您的视图。(将其内容复制到notepadd ++)。转到控制器,然后右键单击actionresult并选择“ generate view”,然后您可以查看控制器在哪里寻找视图并相应地放置视图。
Bill Blankenship 2014年

14

在Microsoft ASP.net MVC中,用于解析传入和传出URL组合的路由引擎是按照“约定优于配置”的思想设计的。这意味着,如果您遵循路由引擎使用的约定(规则),则无需更改配置。

ASP.net MVC的路由引擎不提供网页(.cshtml)。它提供了一种由代码中的类处理URL的方式,该类可以将text / html呈现到输出流,或使用Convention以一致的方式解析和提供.cshtml文件。

用于路由的约定是将Controller与名称类似的类匹配,ControllerNameController即,controller="MyAccount"表示以class命名MyAccountController。接下来是动作,该动作映射到Controller类中的函数,该函数通常返回ActionResult。即action="LoginRegister"会寻找一个功能public ActionResult LoginRegister(){}控制器的类。此函数可能会返回a View(),该约定LoginRegister.cshtml将按约定命名并存储在/Views/MyAccount/文件夹中。

总而言之,您将具有以下代码:

/Controllers/MyAccountController.cs:

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

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


8

在返回视图时在LoginRegister动作中执行以下操作,我知道可以在mvc 5中完成此操作,不确定在mvc 4中是否也可以。

 public ActionResult Index()
 {
     return View("~/Views/home/LoginRegister.cshtml");
 }

5

检查视图的构建操作(.cshtml文件),应将其设置为content。在某些情况下,我已经看到将构建操作设置为None(错误),并且即使您看到该视图存在于有效文件夹下的Visual Studio项目文件中,该特定视图也未部署在目标计算机上


1
就我而言,它也与“ Build Action”属性相关,但我需要将其设置为“ Embedded Resource”
Ali Tahouri

3

这可能是权限问题。

我最近有同样的问题。作为测试,我创建了一个简单的hello.html页面。尝试加载时,出现有关权限的错误消息。解决根Web文件夹中的权限问题后,html页面和MVC呈现问题均已解决。


就我而言,这也是权限问题,允许经过身份验证的用户访问应用程序的根文件夹,并删除只读标志,从而解决了该问题
Momin

2

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

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

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


2

我收到此错误是因为我重命名了View(和POST操作)。

最后,我发现我忘记将GET和POST操作都重命名为新名称。

解决方案重命名GET和POST操作以匹配视图名称。


1

如果问题在生产中间歇发生,则可能是由于操作方法被中断。例如,在涉及大文件上传的POST操作期间,用户在上传完成之前关闭浏览器窗口。在这种情况下,操作方法可能会引发由空模型或视图对象导致的空引用异常。一种解决方案是将方法主体包装在try / catch中并返回null。像这样:

[HttpPost]
public ActionResult Post(...)
{
    try
    {
        ...
    }
    catch (NullReferenceException ex)  // could happen if POST is interrupted
    {
        // perhaps log a warning here
        return null;
    }

    return View(model);
}

1

我有同样的问题。我复制了一个视图“电影”,并相应地将其重命名为“客户”。我对模型和控制器也做了同样的事情。

解决方法是...我将“客户视图”重命名为“ Customer1”,并创建了一个新视图并将其命名为“ Customer ...”。然后我将“ Customer1”代码复制到“ Customer”中。

这工作了。

我很想知道问题的真正原因。

更新 只是为了笑...。我回过头来再次复制了所有重命名方案...并且没有得到任何错误。


0

如果您已经检查了上述答案中的所有内容(这是常见错误),并且确定视图位于例外中的位置,那么您可能需要重新启动Visual Studio。

:(


0

就我而言,我需要使用RedirectToAction来解决问题。

[HttpGet]
[ControleDeAcessoAuthorize("Report/ExportToPDF")]
public ActionResult ExportToPDF(int id, string month, string output)
{
    try
    {
        // Validate
        if (output != "PDF")
        {
            throw new Exception("Invalid output.");
        }
        else
        {
            ...// code to generate report in PDF format
        }
    }
    catch (Exception ex)
    {
        return RedirectToAction("Error");
    }
}

[ControleDeAcessoAuthorize("Report/Error")]
public ActionResult Error()
{
    return View();
}

0

我前一段时间遇到了这个问题,它使我发疯,因为事实证明它很简单。因此,在我的视图中,我使用的是网格控件,该控件通过http请求获取网格的数据。中间层完成我的请求并返回数据集后,我收到了相同的错误。原来我的return语句是'return View(dataset);' 而不是'返回Json(dataset);


0

由于语句关闭不正确,我遇到了此错误,

@using(Html.BeginForm(“ DeleteSelected”,“ Employee”,FormMethod.Post))

{

} //此大括号需要在结尾处关闭。

在Index.cshtml视图文件中。我没有在程序末尾关闭该语句。相反,我最终关闭不当并遇到了此错误。

我确定不需要检查Controller ActionMethod代码,因为我已将Controller方法正确返回给View。因此,它必须是没有响应并且遇到类似错误的视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.