2008-11-10 118 views
11

我一直在玩ASP.NET MVC,并有一个问题。或者,也许是我担心我做错了。只是在一个蹩脚的网站上工作,稍微拉伸我的翅膀。我很抱歉,这个问题并不简明。ASP.Net MVC和RenderPartial w /相对路径

好的,这是场景。当用户访问家庭/索引时,页面应显示产品列表和文章列表。文件布局是这样(DAL是我数据访问层):但是

 
Controllers 
    Home 
     Index  

Views 
    Home 
     Index  inherits from ViewPage 
    Product   
     List  inherits from ViewUserControl<IEnumerable<DAL.Product>> 
     Single  inherits from ViewUserControl<DAL.Product> 
    Article 
     List  inherits from ViewUserControl<IEnumerable<DAL.Article>> 
     Single  inherits from ViewUserControl<DAL.Article> 
Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerable<DAL.Product> and a IEnumerable<DAL.Article>. 

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 

因为我打电话的RenderAction()从产品的图,我预期运行时寻找视图中的“单”视图\产品。但似乎查找是相对于调用原始视图(/ Controller/Home invoked/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); 

此修复工作,但..我不明白为什么我需要指定视图的完整路径。对我来说,将相对名称解释为相对于当前视图的路径而不是原始控制器的视图路径是有意义的。我想不出任何有用的情况下,解释名称相对于控制器的视图,而不是当前视图是有用的(除了在典型的情况下,他们是相同的)。

在这段时间我应该有一个问号?强调这实际上是一个问题。

+0

跨越这只是偶然寻找相关的东西(我知道它的6个月以上)。但是你提到使用RenderAction(),但是你所有的例子都使用RenderPartial(),这是一个错字吗?我会假设RenderAction(而不是RenderPartial)应该在这种情况下工作? – 2009-08-05 21:33:07

回答

4

[编辑:

我就在想,你有两种情况:

  • 主控制器是以往任何时候都引用
  • 用户控件共享的产品/物品列表用户控制的唯一一个由几个控制器

在第一种情况下,视图用户控件确实属于家庭控制器,它是有意义的,把它们放在家庭控制oller文件夹。在第二种情况下,将它们放在共享文件夹中是有意义的,因为它们将由控制器共享。

在这两种情况下,也许你可以把它们放在一个子文件夹中。 Like Views/Home/Products,然后尝试RendarPartial(“Product/Single”)并查看会发生什么情况?我不知道它是否会尝试将其解决为:Home/Product/Single,然后是Shared/Product/Single。如果子文件夹有效,它似乎允许产品和文章的逻辑分离,同时显示它们仍然是主控制器或所有控制器共享的成员。

]

退房史蒂夫·桑德森这个博客条目:

http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/

你在做什么并没有错,但它似乎有点违背观的约定/控制器文件夹名称也就是说,想要定义控制器不可知的视图用户控件并将它们嵌套似乎是有效的是有意义的。所以我不知道!

不管怎么说,链接只是描述了一种代替使用RenderPartial来渲染一个使用控件的方法,它定义了一个RenderPartialRequest方法来呈现控制器动作的返回值(在你的情况下是一个用户控件)。所以你可以添加一个产品和文章控制器与一个操作列表,返回你的用户控制,然后从主页/索引视图调用这两个操作。这对我来说似乎更直观,但只是一个意见。

他还提到MVC Contrib的子控制器,我很确定有这样的愿望成为ASP.NET MVC版本的一部分。

+0

RenderPartial(“Product/Single”)将适用于Product View文件夹中的子文件夹。我刚刚使用了这种技术,我希望保留在与控制器关联的ASPX/ASCX其余部分的子文件夹中。 – RichardOD 2009-07-02 08:50:43

5

因为我打电话的RenderAction() 从产品

视图...

我不明白为什么我需要 指定视图的完整路径。 它将使意义,我对 相对名称 相对被解释为当前视图的路径 而不是原来的控制器的 视觉路径

我想你误解的部分是“执行场所“缺少更好的或官方的术语。路径与你的观点不相关,甚至不是你所说的“控制者的观点”。它们与您的请求URL相关,该URL定义了控制器上下文。我可能不会说得很好,但如果你花时间在Reflector上查看URL和路由的解析方式,我认为这将全部落入你的脑海。

+0

你说的是有道理的。 – 2008-11-12 08:05:57

2

从看MVCStoreFront样品这也是他们所拥有的一切结构调用的RenderPartial

Views 
    Shared 
     ProductSingle 
     ProductList 
     ArticleSingle 
     ArticleList 

然后通过使它们:

<% Html.RenderPartial("ProductSingle", ViewData["ProductList"]); %> 
<% Html.RenderPartial("ProductList", product); %> 
<% Html.RenderPartial("ArticleSingle", article); %> 
<% Html.RenderPartial("ArticleList", ViewData["ArticleList"]); %>