c# - 为什么需要为部分 View 提供完整路径

标签 c# asp.net asp.net-mvc

我是 ASP.NET MVC 的新手,我有一个问题希望你们能帮助我。我有两个简单的 Controller 。一个主 Controller 和一个用于局部 View 。在部分 View Controller 中,我有以下代码片段

public PartialViewResult PartialSection()
{  
   //query for partial view model

   return PartialView("MyPartialView", viewModel);
}

然后在主视图上我做

@Html.Action("PartialSection", "MyPartialController")

上面会抛出以下错误:

The partial view '_MyPartialView' was not found or no view engine supports the searched locations.

如果我更改分部 View Controller 中的代码并提供分部的完整路径

return PartialView("~/Views/Common/_MyPartialView.cshtml", viewModel);

然后我没有收到任何错误,部分 View 按预期呈现。

所以我的问题是为什么在从不同的 Controller 调用它时必须提供 PartialView 的完整路径。

最佳答案

您需要传递完整路径,因为您使用的是自定义文件夹,而不是框架用来获取 View 的现有文件夹。

如果您将 View _MyPartialView.cshtml 放在文件夹 Views >> MyPartial >> 下,那么您不需要写完整的路径,但是因为您已经创建了一个new folder name Common 框架不知道在要求返回 View 时它也必须在该文件夹中查找。

默认情况下,框架只在两个位置查找 View 文件。

1) Views 文件夹内针对 Controller 命名目录的文件夹

2)Views 目录下的 Shared 文件夹中

如果您不想这样做并希望将该 View 保留在 Common 文件夹中,在这种情况下,您可以必须让框架也查看您的自定义文件夹。

您可以在 Global.asaxApplication_Start 事件中注册要查找 PartialView 的自定义文件夹:

RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
if (razorEngine != null)
{
   var newPartialViewFormats = new[] 
                              { 
                                "~/Views/Common/{0}.cshtml"
                              };
   razorEngine.PartialViewLocationFormats = razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
}

可以看看这个blogpost for details.

关于c# - 为什么需要为部分 View 提供完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285617/

相关文章:

c# - 如何在 EF 中更新父实体时添加/更新子实体

c# - 读取 Excel 单元格并设置行颜色

c# - 获取在 Instagram 上喜欢特定媒体的用户列表

c# - javascript 对象加载 C# 字典中的值(并将其作为字典 <string,string> 传递)

.net - 无法将 MySQL 日期/时间值转换为 System.DateTime

c# - 在哪里声明类

c# - Asp.net 在输入字段的自定义属性中呈现控件客户端 ID

c# - EF6 找不到 LocalDBConnectionFactory

c# - 连接到应用程序的多个运行实例

asp.net-mvc - ASP.NET MVC - 不从其他表中获取数据