2012-04-13 58 views
2

我有一個佈局中我使用了一個局部圖的佈局頁面內局部視圖,局部視圖包含我建立了一個菜單功能,我分裂菜單成局部視圖,以確保很容易維護。該菜單被故意放置在佈局中,因爲它在每個頁面上都使用,但是菜單中有條件元素,因此某些選項僅出現在特定頁面上。無法模型傳遞到佈局頁

我已經偶然發現了一個問題,我向前移動,菜單使用ajax調用來渲染包含內容的部分視圖(減少頁面加載)我只是在包含公司的頁面上工作,公司包含聯繫人列表,單擊時的菜單選項應顯示聯繫人列表。我已經在公司模型下加載了聯繫人列表,但是!我無法從應該呈現聯繫人列表的新的局部視圖訪問它,因爲菜單是佈局頁面中包含的局部視圖,因此無法接受模型,所以我無法將模型傳遞到局部視圖I我試圖加載,因爲菜單局部視圖位於佈局頁面中。

這是一個棘手的情況,我顯然可以改變佈局來呈現一個新的部分來包含菜單,所以我可以傳遞一個新的視圖模型,但是我建立的每一個頁面都需要引用菜單(什麼是害蟲!)我必須在這裏失去一些東西(考慮到這是我的第一個MVC3應用程序可能)。有什麼建議麼?

編輯:我自己進一步研究了這個問題,簡而言之,我的佈局頁面總是能夠訪問使用它的頁面模型,因爲包含菜單的我的部分視圖也可以訪問這些數據。我在菜單局部視圖中編寫了一些條件邏輯,用於檢查頁面,然後根據需要傳入數據。

<div class="menu">  
    <ul> 
     <li><a href="@Url.Action("Create", "Contact")">New Contact </li> 
     <li><a href="@Url.Action("Index", "Contact")">Contact List </a></li> 
    </ul> 
    @if (Request.Url.PathAndQuery.Contains("/Contact/Details/")) 
    { 
     <ul> 
      <li>@Html.ActionLink("New Activity", "Create", "Activity", new { companyid = 0, contactid = Model.contact.id }, null)</li> 
     </ul> 
    } 
</div> 

上面是菜單局部視圖的小樣品,但包含一個例子,其中菜單被建成爲接觸/細節頁,並能夠在傳遞model.contact.id。它的工作原理是我的菜單和我的佈局沒有明確包含模型,但它不太整齊。

回答

5

如果我正確理解你的問題,你的問題是,你不認爲你的局部視圖可以有一個模型,因爲你不希望你的佈局有一個模型。所以問題是如何將模型放入佈局中,而不需要每一個動作來擴展布局所使用的基本模型類型。

1)而不是在菜單佈局中使用Html.Partial使用Html.Action然後您將獲得一個獲取菜單數據的操作方法。

2)編寫自定義WebViewPage和包括具有類似

return ((BaseController)ViewContext.Controller).MenuData; 

現在你甚至不需要在你的局部視圖模型,它可以直接訪問數據的屬性。

兩個操作都需要具有包含在基本模型中所有可用的菜單信息的菜單屬性,但如果在你的網站的每一頁將需要訪問這些數據,那麼這似乎是適當的。

編輯:爲了迴應您的整齊關注,聽起來就像您想要的部分,它使您能夠在適當的視圖頁面或子佈局中自定義菜單部分。

請參閱http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx瞭解部分和http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx瞭解嵌套佈局/部分的信息。

+0

感謝您的回覆,我對此進行了一點修改,以便對我的帖子進行編輯。 – 2012-04-15 20:43:36

+0

@DavidAbraham編輯我的答案,就您的新關注提出建議。 – DMulligan 2012-04-16 04:50:14