2009-04-20 67 views
0

看來我對部分視圖的使用的理解並不完全正確。asp.net mvc partialview

我想添加一個從數據庫構建的部分視圖,並使用母版頁中的部分視圖。

使用的NerdDinner項目(至極是偉大的MVC)我已經添加了以下內容:

查看\共享\ dinners.ascx 「:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<NerdDinner.Models.Dinner>>" %> 
<ul> 
    <% foreach (var dinner in Model) { %> 
     <li> 
      <a href="/Dinners/Details/<%=dinner.DinnerID %>"><%= Html.Encode(dinner.Title) %></a> 
     </li> 
<% } %> 
</ul> 

在」 視圖\共享\的Site.Master 「:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
... 
<% Html.RenderPartial("dinners"); %> 

以上只會在哪裏目前速效的列表(例如網站/晚餐)的晚宴對象的網頁目前的功能是有沒有辦法在一個優雅和MVCW¯¯做到這一點。唉或者這是需要一個聰明的妥協?

回答

2

你爲什麼在你的主人那裏?我會爲您的主人添加另一個佔位符,然後將其添加到有意義的位置。我覺得母版頁面應該與具體情況無關。如果你想讓它在所有的晚餐頁面上,只需製作原版的主嵌套。

+0

問題想問一個以前討論過的問題,我正在努力尋找答案。 我正在尋找的解決方案不必駐留在主人;如何將ViewData添加到每個控制器動作似乎並不高雅。也許我在這裏錯過了些什麼 在一個單獨但相關的說明中,AJAX是基於部分視圖實現CRUD的最新方法嗎? – Gavin 2009-04-20 19:56:35

2

這就是IMO,ASP.NET MVC最大的限制之一 - 跨多個視圖管理共享數據(將部分ascx視圖渲染到字符串旁邊!)。如果你谷歌或在stackoverflow上搜索「管理共享視圖數據asp.net mvc」,你會得到很多結果與各種選項,其中沒有一個是非常完美的。微軟的MVC團隊已經認識到這是一個問題,並希望在未來的版本中包含標準解決方案。

根據您管理數據訪問的方式,最簡單的方法可能是創建一個基本Controller類並檢索部分在構造函數內部或OnActionExecuting()內部分所需的數據。

我選擇的選項是在MvcContrib項目中使用Html.RenderAction()輔助方法。它基本上使您能夠從視圖中調用操作方法並呈現響應。這並不好,因爲它需要您的視圖掌握更多有關控制器的知識,但它提供了一個簡單的短期解決方案,無需您連接任何額外的代碼。

0

partialview在我看來本質上是有缺陷的。它根據定義創建模塊耦合並故意破壞內聚力。

0

我同意丹尼爾,即使你的控制沒有顯示在每一頁上,它顯示了其中的一些,你應該創建你的主人爲模板,只是

1

一種方法我用的是創建一個輔助方法和在您的主頁面中使用它。

 
public static void RenderDinners(this HtmlHelper helper) 
{ 
    helper.RenderAction<DinnersController>(c => c.Dinners()); 
} 
 
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
... 
<% Html.RenderDinners(); %> 

正如你所看到的助手呼籲DinnersController控制器的晚餐操作方法。

 
public ActionResult Dinners() 
{ 
    ...get dinners and put in the View 
    return Dinners(view); 
} 
2

這個tutorial on stephan Walther's site處理這個問題。如果你使用了一個抽象基類,那裏的dinners對象被填充並繼承它,它總是可用的,但是你必須知道它總是存在,即使你不需要它)。