2011-01-10 18 views
2

他の言語(PHP/Python)では、特定のHTMLページレイアウトを表すクラスを作成することに慣れています。これらのクラスには、ナビゲーション(マルチレベル)、エラーメッセージ、情報メッセージ、フッターテキストなど、属性や動的機能の数に制限はありません。これらの項目のほとんどはデフォルト値を持ちますが、ページごとにオーバーライドされる可能性がありますレベル。ASP.Net MVC 3 Razor:動的レイアウトに情報を作成して渡す方法

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

やPHP例:

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://......") 

または、エラーを処理:たとえば

$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を想定)

許してください、ここで-と、そこにポスト...私はそれが新しい(剃刀)と私にとって新しい(ASP.Net MVC)プラットフォームで行われた "正しい方法"を理解しようとしています。

一般的なアドバイスは大歓迎です!

答えて

1

私は通常コントローラプロパティ(MainMenu)を持っています。ViewData辞書にController.OnResultExecutingのBaseControllerで追加しています。 mvc3にはViewBagという名前が付けられており、それは動的オブジェクトです。

もう1つの方法は、剃刀でセクションを使用することです。この質問をご覧ください:ContentPlaceHolder in Razor?

+0

確認していただきありがとうございます。 – gahooa

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 .:私を信じて!これは便利です!おそらく純粋主義者のためのベストではないかもしれませんが、それは本当に便利です! :-)

関連する問題