2017-01-24 7 views
-1

私は最終的にWebFormsからMVCに移行しており、質問が発生していて、私は良い解決策を見つけることができないようです...複数のコントローラが同じデータを表示するMVCの部分ビューまたはベースビューモデルですか?

私は_layout.cshtmlページに最後のログされたユーザーのための4つのメッセージ。これはサイトのすべてのコントローラに存在します。

どうすればよいですか?

A)BaseViewModel:

public ActionResult Index() 
{ 
    HomeViewModel h = new HomeViewModel(); 
    h.UserName = "Daniele"; //in BaseViewModel 
    h.LastMessages = _messagesRepository.GetLastItems(4); //in BaseViewModel 

    //Other data specific to index page 

    return View(h); 
} 

public ActionResult Dashboard() 
{ 
    HomeViewModel h = new HomeViewModel(); 
    h.UserName = "Daniele"; //in BaseViewModel 
    h.LastMessages = _messagesRepository.GetLastItems(4); //in BaseViewModel 

    //Other data specific to dashboard 

    return View(h); 
} 

:すべてのアクションすべてのコントローラおよびIはBaseViewModelから、私は、データ+ baseviewModelの最後の4メッセージを設定し、すべてのコントローラに継承特定のviewmodelを作成する必要がB)のHTML処置:より良い解決策だが、すべてのコントローラで私はまだ私が作成しますすべてのコントローラに

[ChildActionOnly] 
public PartialViewResult LastMessages() 
{ 
    //Code 
} 

を貼り付け&をコピーする必要があります。

最高のプラシタは何ですか?提案? ありがとうございます。

+1

コントローラを 'Html.Action'で指定することができます – TryingToImprove

+2

' [ChildActionOnly] 'メソッドを使用しますが、あなたのコントローラの1つ(例えば' MessagesController')内にある必要があります。 {Html.RenderAction( "LastMessages"、 "Messages"); } ' –

答えて

0

a)は2017年に私は非常にあなたがangular.jsを見てか、そのの不在で)JS

Bの反応をお勧めします、プロジェクトにjQueryのを追加します。 $(document).ready()にある部分を作成し、4つの項目を提供するONEアクションを呼び出します。 このコードは一度だけ存在し、どこからでも使用できます。

+0

面白い!しかし、..私はjavascriptの使用を避けたい場合は好奇心の外に、aとbは私の質問を解決するために利用できる唯一の2つのオプションですか?ありがとう。 –

+0

私は両方のオプションについて私に答えをくれました。あなたの意見では、どれが最初に始まるのがベストですか? AまたはB? –

+0

@DanieleArrighi JavaScriptを使用しないようにするには、ASP.Netコントロールをコードの背後で使用してレンダリングすることができます。残念ながら私の専門知識は素晴らしくないので、私はそれほど説明できません。 で始まるという点では、あなたがすでにどれだけ持っているかによって異なります。プロジェクトの40%を超える人は、jQueryを追加してください。 MVCビューを使って簡単にMVCビューを拡張することができ、コードの動作原理を変更することはありません。開始する場合は、タイムラインに追加する余分な月があるかどうかを検討してください。そうした場合は、フロントエンドフレームワークから開始してください。 – zaitsman

関連する問題