2008-11-10 122 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"]); %>