我一直在玩ASP.NET MVC并且有一个问题.或者也许我担心这样做是错误的.只是在一个跛足的地方工作,伸展我的翅膀.对不起,这个问题根本不简洁.
好的,这是场景.当用户访问home/index时,该页面应显示产品列表和文章列表.文件布局是这样的(DAL是我的数据访问层):
Controllers Home Index Views Home Index inherits from ViewPage Product List inherits from ViewUserControl> Single inherits from ViewUserControl Article List inherits from ViewUserControl > Single inherits from ViewUserControl
Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerableand a IEnumerable . View.Home.Index will use those view entries to call: Html.RenderPartial("~/Views/Product/List.ascx", ViewData["ProductList"]) and Html.RenderPartial("~/Views/Article/List.ascx", ViewData["ArticleList"]) View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("Single", product); View.Article.List does something similar to View.Product.List
然而,这种方法失败了 这种方法对我来说很有意义,但也许对这些MVC平台有更多经验的人会认识到更好的方法.
以上内容在View.Product.List中产生错误.打电话Html.RenderPartial("Single",...)
抱怨没有找到"单一"视图.错误表明:
The partial view 'Single' could not be found. The following locations were searched: ~/Views/Home/Single.aspx ~/Views/Home/Single.ascx ~/Views/Shared/Single.aspx ~/Views/Shared/Single.ascx
因为我从Product中的视图调用RenderAction(),所以我希望运行时在Views\Product中查找"Single"视图.然而,似乎查找是相对于调用原始视图的控制器(/ Controller/Home invoked/Views/Product)而不是当前视图.
所以我可以通过更改Views\Product来解决这个问题,这样:
View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("~/Views/Product/Single.ascx", product);
代替
View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("Single", product);
这个修复工作,但..我不明白为什么我需要指定视图的完整路径.我相对于当前视图的路径而不是原始控制器的视图路径来解释相对名称是有意义的.我想不出任何有用的情况,即相对于控制器视图而不是当前视图解释名称是有用的(除了在它们相同的典型情况下).
大约这个时候我应该有一个问号?强调这实际上是一个问题.
因为我从Product中的视图调用RenderAction()
...
我不明白为什么我需要指定视图的完整路径.相对于当前视图的路径而不是原始控制器的视图路径来解释相对名称对我来说是有意义的.
我认为你误解的部分是缺乏更好或官方术语的"执行地点".路径与您的视图无关,甚至不是您所说的"控制器视图".它们与您的请求URL相关,后者定义了控制器上下文.我可能不是很好说,但是如果你花了一点时间在Reflector中查看URL和路由是如何解决的,我认为这一切都会落到你的脑海中.