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

时间:2013-09-02 15:17:14

标签: c# asp.net-mvc asp.net-mvc-4 visual-studio-2012

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

Contollers:
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>

并且每个控制器包含一个ActionResult用于索引(),一些FormCollections而不是其他。屏幕显示正常,拉动,编辑和更新数据库没问题。

我想将我的观点更改为更具描述性的层次结构,因此移动了我的View文件:

查看:
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&amp; ResourceType)不会显示,因为当foreach循环尝试运行其相关模型时会抛出错误 - 现在返回为null。我很困惑,如何更改View文件的位置可以改变数据访问的可行性(因为,在我看来,模型是通过不改变的ab路径@model IEnumerable<Library.DAL.PrmTbl_Level>填充的。)

有人可以解释如何更改View的位置会影响其对Controller和Model的访问吗?

修改
我当前的设置(文件结构如上):

ParametersController

public ActionResult Index() {
    ViewBag.Title = "Parameters";
    return View();
}
public ActionResult ResourceType() {
    return RedirectToAction("ResourceType");
}

这为我提供了合适的网址,但'Firefox已检测到服务器正在以永远无法完成的方式重定向此地址的请求。'使用RedirectToAction "ResourceType","Index"做出决议到url'/ Index / ResourceType'并且找不到资源。

2 个答案:

答案 0 :(得分:0)

我不清楚这行代码:

public ActionResult ResourceType() { return View("ResourceType/Index"); }

这是否意味着您要从参数控制器加载资源类型视图?

如果是这样的话,那不是你想要做的。您想使用RedirectToAction

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

编辑#2

根据您的评论,

  

然后我想,一旦那些子视图被加载,他们自己   个别控制人会接管吗?

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

答案 1 :(得分:0)

我在这里注意到的一些事情:

  1. 在上面显示的操作方法中,您没有将模型传递给视图,而只是调用视图。要传递查看模型,您需要将其作为View方法的第二个参数提供,即return View("ResourceType/Index", model);。此外,我相信如果您要将路径(而不仅仅是视图的名称)传递给View方法,则需要指定完整路径和文件扩展名,即〜/ Views / Parameters / ResourceType / Index.cshtml 。 @Phil Sandler也提到了使用RedirectToAction的好处,因为你试图返回与另一个Controller关联的View。

  2. 如果要更改默认的View层次结构,则应考虑扩展RazorViewEngine以使用新目录补充其搜索位置。看看这个问题的一个例子(它使用WebFormViewEngine,但你为Razor做同样的事情):Can I specify a custom location to "search for views" in ASP.NET MVC?

  3. 最后,我并不了解你的新等级。为什么 ReaderLevel ResourceType 视图位于 Parameters 子目录下,如果它们不属于该控制器?新的层次结构实际上似乎更令人困惑,这可能使以后更难理解。也许我们没有所有信息来理解你的决定,但这看起来很奇怪。