部分视图未找到或没有视图引擎支持所搜索的位置。

48

我有以下的控制器代码:

public MyController:Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [ChildActionOnly]
    public ActionResult MyPartialViewAction()
    {
        return PartialView("~/Views/Shared/MyCustomFolder/_MyPartialView",PartialViewModel);
    }
}

我的索引视图包含以下代码:

@HTML.Action("MyPartialViewAction")
当我运行 Web 应用程序时,出现了 HttpException 异常,并且 InnerExceptionMessage 的消息为:
InnerException {"The partial view '~/Views/Shared/MyCustomFolder/_MyPartialView' was not found or no view engine supports the searched locations. The following locations were searched:\r\n~~/Views/Shared/MyCustomFolder/_MyPartialView"} System.Exception {System.InvalidOperationException}
目前为止我尝试过:
- 将 `_MyPartialView` 从 `~/Views/Shared/MyCustomFolder` 移动到 `~/Views/Shared/` 和 `~/Views/MyControllerFolder`,但仍然存在错误。 - 尝试将我的 Index View 代码更改为 `@HTML.RenderAction()`,但没有成功。
请问您认为我错在哪里了?
谢谢。
6个回答

74

如果所选答案对于您不起作用,以下是解决方法:

我将cshtml文件的构建操作更改为内容(Content),问题得到了解决。


17
当我复制并粘贴一个cshtml文件而不是新增一个新文件时,通常会出现这种情况。 - Sanvir Manilal
2
我也遇到了同样的问题 - 文件不知何故被设置为嵌入式资源。将其改回内容(Content)后,它当然就可以工作了。 - AVH
9
对于不知道如何更改构建操作的人:右键单击文件 > 属性 > 构建操作 > 选择内容。(确保您没有在调试,否则下拉列表将被禁用) - JordanGW
1
哇,经过这么多年和 VS 版本的更新,问题仍然在 VS22 中出现!很幸运找到了这个绝妙的答案。 - Krishna Gupta
2023年仍然有用!谢谢! - undefined
显示剩余2条评论

60
您需要将.cshtml扩展名添加到视图名称中:
return PartialView("~/Views/Shared/MyCustomFolder/_MyPartialView.cshtml",PartialViewModel);

没错,这个方法可行,我以为 Razor 会自动处理文件扩展名。谢谢 @Maess。 - NaN
我曾经遇到过同样的问题。我认为可能是因为我们使用了“~/Views”而不是默认路径,所以我们现在必须写出整个文件路径(包括扩展名),因为我们现在对视图名称进行了明确说明。 - MikeTeeVee
我也遇到了这个错误:“未找到[_myPatialView]部分视图或没有视图引擎支持搜索的位置。” 我不得不删除.cshtml扩展名才能正确呈现部分视图。 - Mike

11
如果答案仍然无法解决您的问题,并且您将部分内容放在了partials文件夹内的嵌套文件夹中,请确保您提供包含扩展名的部分的完整路径。 @Html.Partial("~/Views/Partials/Components/_AdvancedComponentRenderer.cshtml", Model.Content);

5

同时,请务必仔细检查文件名后缀".cshtml"之前是否有空格。我曾经在文件名后面不小心加入了一个空格,结果就打乱了PartialView()的自动行为。


2

希望这段代码能对你有所帮助(在".cshtml"文件中)

@using Microsoft.AspNetCore.Mvc.ViewEngines
@inject ICompositeViewEngine Engine

....
string path = "../Themes/User/_head";

@if (Engine.FindView(ViewContext, path, isMainPage: false).Success)
{
    <partial name="@path" for="@Model" />
}
else
{
    <partial name="../Themes/Admin/_head" />
}

谢谢


0

我收到了这个错误信息,因为部分视图被添加到项目文件(.csproj)中,但实际上并不存在于磁盘上。


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