2008-09-07 52 views
8

這是一個場景:假設我有兩個控制器負責顯示不同類型的內容 - 頁面和文章的網站。我需要將部分視圖嵌入到我的母版頁中,該頁面將列出按某些條件過濾的頁面和項目,並顯示在每個頁面上。我無法在我的主頁上設置模型(對不對?)。我如何使用Html.RenderPartial解決此任務?Html.RenderPartial來自主頁面

[編輯] 是的,我可能會創建單獨的部分視圖列出文章和頁面,但仍有一個障礙,我不能也不應該在masterpage上設置模型。我需要以某種方式說「這裏是頁面」作爲我的渲染部分的參數,還有文章。 renderpartial的全部概念與來自masterpages數據庫的數據對我來說有點模糊。

回答

0

ViewData模型屬性應該只用於您在UI主要部分查看/編輯的內容。

視圖的其他部分可能需要ViewData中的一些數據,因此只需將這些數據添加到字典中。

我只是從字典中傳遞數據,如下所示:ViewData [「articles」]到部分。 (或者來自MvcContrib的ViewData.Get())。

你也可以看看MvcContrib中實現的最近實現的SubController模式。

0

是的,這是正確的。但讓我們看看這種情況: 對與文章相關的視圖,我有ViewData [「文章」],以及與頁面相關的視圖,我有ViewData [「頁面」],但我沒有文章和頁面可用的所有時間。所以,如果我補充一下:

Html.RenderPartial( 「articlesView」,計算機[ 「文章」])

Html.RenderPartial( 「pagesView」,計算機[ 「頁」])

我masterpage,我會在ViewDataDictionary不包含文章和頁面的每個頁面上拋出一個異常。

至少,這就是我的看法。

1

我有一個similar post並提出了一個對象模型來處理它。

我討厭非強類型的意見,所以採用這種方法,它運作良好。

2

如何創建一個HtmlHelper擴展方法,使您可以調用控制器上的操作的部分視圖結果。

喜歡的東西

public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender) 
    where TController : Controller, new() 
{ 
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext}; 
    actionToRender(arg).ExecuteResult(arg.ControllerContext); 
} 

然後你可以在你的母版頁使用像

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %> 

,並在控制器適當的方法

public PartialViewResult RenderPartial() 
{ 

    return PartialView("~/Path/or/View",_homeService.GetModel()) 
} 

那麼這是我的2美分無論如何

0

我處理這個的方式是使用BaseViewModel。對於從BaseViewModel繼承的視圖模型,所有視圖都是強類型的。

BaseViewModel類具有MasterPage所需的所有信息。因此,對於導航您的BaseViewModel可能看起來像這樣:

​​

在你的母版和PartialViews,你可以投的模型BaseViewModel並訪問NavigationsItems屬性。

<ul> 
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %> 
    <li> 
     <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a> 
    </li> 
<% } %> 
</ul> 
0

這是一個非常晚的答覆,但是我在Google上搜索了這個頁面 - 所以別人也會看到這個問題(以及我的回覆)。

我解決這個問題的方式是使用一個簡單的jQuery腳本來加載PartialView並執行它的控制器代碼。下面的示例。

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <script type="text/javascript"> 
      $(document).ready(function() { 
      $("#applicationForm").load("/Home/ApplicationForm"); 
      }); 
    </script> 

    <div id="applicationForm" /> 

</asp:Content> 

大的缺點,這種方法的缺點是客戶必須啓用腳本爲它工作(所以真的SEO不友好)。如果這是你可以生活的東西,那就很好。我只在內部網站上使用它,我知道每個客戶端都啓用了JavaScript,我不必擔心谷歌的機器人。