2011-01-10 74 views
2

在其他語言(PHP/Python)中,我習慣於創建一個代表給定HTML頁面佈局的類。這些類可以具有無限數量的屬性和動態特性,例如導航(多級),錯誤消息,信息消息,頁腳文本等......這些項目中的大多數都有默認值,但可能會在每頁上覆蓋水平。例如:ASP.Net MVC 3 Razor:如何創建信息並將其傳遞給動態佈局

Layout = MainPage() 

Layout.Title = "Google Image Search" 

Layout.Nav1.Add("Google", "http://www.google.com", Selected=True) 
Layout.Nav1.Add("Yahoo", "http://www.yahoo.com") 
Layout.Nav1.Add("Bing", "http://www.bing.com") 

Layout.Nav2.Add("Google Image Search", "http://......", Selected=True) 
Layout.Nav2.Add("Google Shopping Search", "http://......") 
Layout.Nav2.Add("Google Video Search", "http://......") 
Layout.Nav2.Add("Google Web Search", "http://......") 

,或者處理錯誤:

try: 
    # do something 
except ValidationError as e: 
    Layout.Error.Add(e) 

或PHP例子:

$Layout->Info[] = "Your changes have been saved!"; 

我的問題是:我該如何實現類似的功能集成到ASP.Net MVC 3剃鬚刀(VB)?

到目前爲止,我已經能夠看到如何使用ViewData將各種數據位傳遞給視圖。另外,我一直在使用強類型視圖。

坦率地說,我不確定誰的工作是擁有這個邏輯,控制器或視圖(或者是否有應該在某處的模型)。

這裏是我所拍攝的內容摘要:

  1. 一個地方來初始化默認值的佈局(如導航的第一層,等...)
  2. 強類型屬性,如Public Readonly Property Nav1 as List(of NavElement)
  3. 和一個地方,使這些佈局元素(我假設_Layout.vbhtml

請原諒這裏,和那裏的這個post ...我試圖弄清楚它是在一個新的(Razor)和新的(ASP.Net MVC)平臺上完成的「正確的方式」。

一般建議非常歡迎!

回答

1

我通常有一個控制器屬性(MainMenu),我將其添加到我的BaseController中的Controller.OnResultExecutingViewData字典中。請注意,它在mvc3中被命名爲ViewBag,它是一個動態對象。

另一種方法是在剃鬚刀中使用部分。看看這個問題:ContentPlaceHolder in Razor?

+0

感謝您覈實和澄清。 – gahooa 2011-01-14 15:01:38

1

我傾向於fat models, skinny controllers的角度。如果是我,我會爲您的頁面模型創建一個基類,爲您的常用數據提供支持。然後,您可以繼承個人頁面模型,並將您的頁面特定數據存儲在那裏。

對我來說運行良好的MVC實現通常具有相對乾淨的控制器。控制器就是連接器,從請求中獲取數據到模型中,然後將準備好的模型交給正確的視圖。

至於如何在.Net中存儲事物集合 - 請參閱實現IEnumerable interface的類。特別關注DictionaryList類。字典對象存儲名稱/值對,並可以包含嵌套字典。您可以像使用PHP中的多維數組一樣使用它們。列表對象只是相同類型項目的索引集合。你可以像使用PHP中的簡單數組一樣使用它們。

一邊注意 - 如果您是剛在.Net和從PHP/Python的背景的開始,它可能會更好,如果你可以切換到C#。你會發現語法更舒適和教程/例子更豐富(尤其是在asp.net mvc的世界)

0

這並不難! :-) 如果佈局模型是同一類型的內容頁面的,該協會是自動的!這是最簡單的例子...

這是一個測試佈局:

@model string 
<style> 
.test 
    { 
     background:@Model; 
    } 
</style> 
<div class="test"> 
    Ciao 
</div> 
@RenderBody() 

這是一個測試頁面內容

@{ 
    Layout = "~/Views/Shared/_Test.cshtml"; 
} 
@model string 
...blah blah... 

只需撥打的東西,如查看:

... 
return View("Name", (object)"Green"); 

它完成!該模型在內容頁面和佈局頁面中是相同的! 安德烈

P.S:相信我!這很有用!也許它不是純粹主義者的最佳選擇,但它確實很有用! :-)

相關問題