C# VS 2012 MVC-视图文件的文件结构如何影响对相关模型/控制器文件的访问?

C# VS 2012 MVC-视图文件的文件结构如何影响对相关模型/控制器文件的访问?,c#,asp.net-mvc,asp.net-mvc-4,visual-studio-2012,C#,Asp.net Mvc,Asp.net Mvc 4,Visual Studio 2012,为了解释,我的初始设置如下: 控制者: Library=>Controllers=>ParametersController.cs Library=>Controllers=>ReaderLevelController.cs Library=>Controllers=>ResourceTypeController.cs 视图: Library=>Views=>Parameters=>Index.cshtml Library=>Views=>ReaderLevel=>Index.cshtml Li

为了解释,我的初始设置如下:

控制者:
Library=>Controllers=>ParametersController.cs

Library=>Controllers=>ReaderLevelController.cs

Library=>Controllers=>ResourceTypeController.cs

视图:
Library=>Views=>Parameters=>Index.cshtml

Library=>Views=>ReaderLevel=>Index.cshtml

Library=>Views=>ResourceType=>Index.cshtml

每个视图都引用了相应的模型,如下所示:
@model IEnumerable

每个控制器都包含一个Index()的
ActionResult
,一些
FormCollections
,其他的不多。屏幕显示良好,拉取、编辑和更新数据库没有问题

我想将视图更改为更具描述性的层次结构,因此将视图文件移动如下:

视图:
Library=>Views=>Parameters=>Index.cshtml

Library=>Views=>Parameters=>ReaderLevel=>Index.cshtml

Library=>Views=>Parameters=>ResourceType=>Index.cshtml

然后,我更新了
ParametersController.cs
文件,以反映新的ActionResults,该文件现在将指向它,它是“父”文件:

    public ActionResult ResourceType() { return View("ResourceType/Index"); }
然而,现在新的“子”屏幕(在本例中为ReaderLevel&ResourceType)不会显示,因为当foreach循环尝试运行其相关模型时会抛出一个错误,该模型现在返回为null。对于更改视图文件的位置如何改变数据访问的可行性,我感到困惑(因为在我看来,模型是通过ab路径
@Model IEnumerable
填充的,该路径不会改变)

是否有人可以解释更改视图的位置如何影响其对控制器和模型的访问

编辑
我的当前设置(文件结构如上所述):

参数控制器


这为我提供了适当的url,但“Firefox检测到服务器正在以一种永远不会完成的方式重定向对此地址的请求。”使用RedirectToAction
“ResourceType”,“Index”
解析为url“/Index/ResourceType”,无法找到资源。

我不清楚这一行代码:

public ActionResult ResourceType() { return View("ResourceType/Index"); }
这是否意味着您正在从参数控制器加载资源类型视图

如果是这样的话,那不是你想做的。你想用

编辑:您还可以使用不同的View()重载在现有代码中提供模型。我想这不是你想要的,因为你有一个ResourceTypeController

编辑#2

根据你的评论,

然后我想,一旦加载了这些子视图,它们自己的 个别管制员会接管吗


不,事实上是相反的。控制器加载视图(并传递模型,如果需要)。看起来您正在尝试加载视图,并希望它加载自己的控制器。重定向到正确的URL,控制器将接管。

因此我注意到以下几点:

  • 在上面显示的操作方法中,您没有将模型传递给视图,您只是调用视图。要向视图传递模型,需要将其作为
    View
    方法的第二个参数,即
    返回视图(“ResourceType/Index”,Model)。此外,我认为如果要向
    View
    方法传递路径,而不仅仅是视图的名称,则需要指定完整的路径和文件扩展名,即~/Views/Parameters/ResourceType/Index.cshtml@菲尔·桑德勒(Phil Sandler)在使用
    RedirectToAction
    时也提出了一个很好的观点,因为您正试图返回与另一个控制器关联的视图

  • >P>如果您想更改默认视图层次结构,则应该考虑扩展<代码> RasRoView引擎< /代码>,以补充其新目录的搜索位置。以这个问题为例(它使用了
    WebFormViewEngine
    ,但您对Razor也做了同样的事情):

  • 最后,我真的不理解你的新等级制度。如果ReaderLevel和ResourceType视图不属于该控制器,为什么要将它们放在Parameters子目录下?新的层次结构实际上看起来更加混乱,这可能会使以后更难理解。也许我们没有所有的信息来理解你的决定,但这似乎很奇怪


  • 你想在视图中创建子文件夹吗?@JEMI是的,因为我想在视图树的参数文件夹中创建ReaderLevel和ResourceType文件夹。你可以反向操作——它应该重定向到操作(“索引”,“资源类型”)。@PhilSandler如果我这样做,它会尝试到达“~/Views/Shared/Index.cshtml”(不存在)。如果我尝试
    “Index”,“Parameters/ResourceType”
    我会再次出现浏览器错误(“…永远不会完成的方式”)。当您按照我的建议编写代码时,它是否会击中资源类型控制器中的任何代码?tbh,我也不清楚这一行代码。我认为通过参数视图进行的任何操作都将由参数控制器处理,包括到其他视图的链接。然后我想,一旦这些子视图被加载,它们自己的控制器就会接管?因此,此行只是将用户从参数视图传递到ResourceType视图。我错了,obv…如果你能提供一个
    重定向到操作
    调用的示例,考虑到概述的情况,我将不胜感激-我尝试的任何版本都会抛出异常,或者“Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求。”不幸的是,我发现MSDN手册(对我来说)非常抽象。什么
    public ActionResult ResourceType() { return View("ResourceType/Index"); }