解释一下,我的初始设置如下:
收费员:
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<Library.DAL.PrmTbl_Level>
每个控制器都包含一个 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<Library.DAL.PrmTbl_Level>
不会改变(。
有人可以解释一下更改视图的位置如何影响其对其控制器和模型的访问吗?
编辑
我当前的设置(文件结构如上(:
参数控制器
public ActionResult Index() {
ViewBag.Title = "Parameters";
return View();
}
public ActionResult ResourceType() {
return RedirectToAction("ResourceType");
}
这给了我适当的网址,但是"Firefox 检测到服务器正在以永远无法完成的方式重定向对此地址的请求。使用 RedirectToAction "ResourceType","Index"
解析为 url '/Index/ResourceType',但找不到该资源。
我不清楚这行代码:
public ActionResult ResourceType() { return View("ResourceType/Index"); }
这是否意味着您正在从参数控制器加载资源类型视图?
如果是这样的话,这不是你想做的。 您想要使用重定向到操作。
编辑:您还可以使用不同的 View(( 重载在现有代码中提供模型。 不过,我认为这不是您想要的,因为您确实有一个ResourceTypeController。
编辑 #2
根据您的评论,
然后我想,一旦加载了这些子视图,它们自己的 单个控制器会接管吗?
不,它实际上以相反的方式工作。 控制器加载视图(如果需要,则传递模型(。 看起来您正在尝试加载视图,并期望它加载自己的控制器。 重定向到正确的 URL,控制器将接管。
所以我在这里注意到一些事情:
-
在上面显示的操作方法中,您不是将模型传递给视图,而只是调用视图。 要传递视图模型,您需要将其作为第二个参数提供给
View
方法,即return View("ResourceType/Index", model);
. 另外,我相信如果您要将路径(而不仅仅是视图的名称(传递给View
方法,则需要指定完整路径和文件扩展名,即~/Views/Parameters/ResourceType/Index.cshtml。 @Phil Sandler 也提出了一个关于使用RedirectToAction
的很好的观点,因为您正在尝试返回与另一个控制器关联的视图。 -
如果要更改默认的视图层次结构,则应考虑扩展
RazorViewEngine
以使用新目录补充其搜索位置。 看看这个问题的例子(它使用WebFormViewEngine
但你对 Razor 做同样的事情(:我可以指定一个自定义位置来 ASP.NET MVC 中的"搜索视图"吗? -
最后,我真的不明白你的新层次结构。 如果读者级别和资源类型视图不属于该控制器,为什么它们被放置在参数子目录下? 新的层次结构实际上似乎更令人困惑,这可能会使以后更难理解。 也许我们没有所有的信息来理解您的决定,但这似乎很奇怪。