2010-06-05 69 views
0

我已經創建了一個Site.Master文件,該文件是我的模板,可用於導航的大多數站點。這個導航是基於遞歸實體(稱爲頁面)動態創建的。 - parentID爲0的頁面是頂層,自然,每個子項都攜帶它在該字段中的父項Id。如何檢查變量是否在ASP.NET MVC中的主文件中定義

我創建了一個快速的小幫助程序,它接受頁面的ID並通過對具有與傳遞的ID匹配的parentId的子項執行foreach來生成nav。在大多數網站上,我希望Site.Master使用parentId爲0,但如果我在顯示頁面的強類型視圖中,我自然希望使用頁面的Id。

有沒有辦法在Site.Master中做這樣的條件邏輯(並且是否違反了MVC規則)? 「如果我在/頁/ {Id}的強類型頁上,使用Id渲染導航,否則使用0」

回答

1

這聽起來像您的PageID僅在頁面控制器中有用。

考慮將PageID通過ViewData傳遞給您的視圖。主頁面可以簡單地檢查ViewData是否存在,並且可以選擇調用你的Html輔助方法。

頁數控制器

ViewData["PageID"] = somePageID; //zero or non-zero. 

萬事達:當任何控制器INFACT通行證PAGEID在ViewData的值,則該HTML代碼段將被寫入。當它沒有通過時,這是一個廉價的空檢查。

<% if (ViewData["PageID"] != null) 
{ 
    Response.Write(Html.RenderNav(ViewData["PageID"])); 
} 
%> 

這種風格對我來說是最有意義的。 PagesController將一個簡單的值傳入ViewData

將此與主頁面進行對比,試着確定每個請求:URL是什麼,Controller是誰,OK,現在去獲取PageID,是數字還是ok,現在寫HTML。所有這些邏輯不屬於視圖。按照慣例:保持視圖愚蠢。

希望保持您的強類型ViewModels,但在ViewData中使用。這樣,這是一個簡單的檢查在主,這是不強類型的存在。

我會建議ViewData戰略更容易理解和維護。

這聽起來是你想在Master中寫出這個導航。 也許可以考慮將它移動到內容區域,其中視圖具有對出現的內容的細粒度控制。

頁面查看

<asp:Content ID="nav" ContentPlaceHolderID="PagesNavContent" runat="server"> 
    <%= Html.RenderNav(ViewData["PageID"])%> 
</asp:Content> 
+0

我應該說我使用強類型的網頁 - 每個視圖有一個視圖模型我創建。但是,我真的不想爲每個ViewModel的pageId添加一個屬性。我的意思是,我可以讓其他系統(新聞,事件,日曆,關於我們公司等)的每個視圖在ViewModel中擁有一個pageId = 0,但是我希望能夠檢測到「我們是否在Pages Controller?使用pageID。否則,使用0「 – Mortanis 2010-06-05 04:32:51

1

想通了:

 int navPageId = 0; 
     if (ViewContext.RouteData.Values["controller"] == "Pages" && ViewContext.RouteData.Values["Id"] != null) 
     { 
      navPageId = Convert.ToInt32(ViewContext.RouteData.Values["Id"]); 
     } 
     Html.RenderNav(navPageId); 
相關問題