2009-04-20 14 views
0

部分的なビューの使用を私の理解は間違っているようです。asp.net mvc partialview

データベースから構築された部分ビューを追加しようとしており、マスターページ内で部分ビューを使用しています。ビュー\共有\ Site.Master: "内

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<NerdDinner.Models.Dinner>>" %> 
<ul> 
    <% foreach (var dinner in Model) { %> 
     <li> 
      <a href="/Dinners/Details/<%=dinner.DinnerID %>"><%= Html.Encode(dinner.Title) %></a> 
     </li> 
<% } %> 
</ul> 

"

ビュー\共有\のdinners.ascx:NerdDinnerプロジェクト私は次のように追加した(ウィッヒは、MVCのために大きい)を使用して

":

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
... 
<% Html.RenderPartial("dinners"); %> 

は上記のみ現在、ディナーオブジェクトが現在のリスト(例:サイト/ディナー)として空くれるページに機能しますエレガントでMVCワットでこれを行う方法はあります。または賢い妥協を必要とするこの何かですか?

答えて

2

なぜあなたはマスターにいますか?私はあなたのマスターに別のプレースホルダーを追加して、それが理にかなっている場所に追加します。私はマスターページは細部には無関心でなければならないと感じています。あなたがそれをすべての夕食のページに載せたいなら、元のものを入れ子にしてください。

+0

前に議論した質問をするAppologiesは、私は答えを見つけるのに苦労しています。 私が探している解決策は、マスターに存在する必要はありません。すべてのコントローラーのアクションにViewDataを追加すると、気に入らないようです。おそらくここに何かが恋しかった。 AJAXは、部分ビューに基づいてCRUDを実装するための最もきれいな方法ですが、別に関連する注釈がありますか? – Gavin

+0

マスターページをネストできると思います。 –

2

これは、ASP.NET MVCの最大の制限の1つです。複数のビュー間で共有データを管理します(部分的なascxビューを文字列にレンダリングするのと同じです)。あなたがgoogleや 'shared view data asp.net mvcの管理'のようなもののためにstackoverflowで検索すると、どれも本当に完璧なものではなく、さまざまなオプションを使って1トンの結果を得るでしょう。マイクロソフトのMVCチームはこれを問題として認識しており、将来のリリースでは標準的なソリューションが含まれることを願っています。

データアクセスをどのように管理するかによって、最も簡単な方法は、基本コントローラクラスを作成し、コンストラクタ内または()内の部分データに必要なデータを取得することです。

私が選択したオプションは、MvcContribプロジェクト内でHtml.RenderAction()ヘルパーメソッドを使用することです。基本的には、ビューからアクションメソッドを呼び出してレスポンスをレンダリングすることができます。これは、あなたの意見ではコントローラについての知識はまだまだありますが、それは簡単な短期的な解決策であり、あなたの追加コードを追加する必要はありません。

0

私は本質的に欠陥があるようです。モジュール結合を作成し、定義によって意図的に結束を破ります。

0

私はあなたのコントロールは、すべてのページに示していない場合であっても、それはそれらのいくつかに示し、ダニエルに同意し、テンプレートとしてあなたのマスターを作成する必要があり、私が使用する唯一

1

一つの方法は、ヘルパーメソッドを作成することで、あなたのマスターページでそれを使用してください。

 
public static void RenderDinners(this HtmlHelper helper) 
{ 
    helper.RenderAction<DinnersController>(c => c.Dinners()); 
} 
 
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
... 
<% Html.RenderDinners(); %> 

ヘルパーはDinnersController上のディナーアクションメソッドを呼び出し、あなたが見ることができるように。

 
public ActionResult Dinners() 
{ 
    ...get dinners and put in the View 
    return Dinners(view); 
} 
2

このtutorial on stephan Walther's siteはこの問題を処理します。ディナーオブジェクトが設定された抽象基本クラスを使用してそれを継承する場合は、常に使用可能ですが、必要がなくても常にそこに存在することに注意する必要があります。

関連する問題