5

ASP.NET MVC ビューで外部のコンポーザブル パーツをサポートするにはどうすればよいでしょうか?

これはどういう意味ですか?「すべてのページのログイン ボックス」または「iGoogle」のいずれかを考えてください。各コントローラー/ビューの外部にある特定の場所にある必要があるものです。

これに対する 1 つのアプローチは、次のようにビューにコンポーネントを追加することです。

<% foreach (var component in GetComponents()) {%>
    <%= Html.RenderPartial(component.ViewName, component.ViewData)%>
<%} %>

上記の例では、表示されるビューのコントローラーではなく、各コンポーネントのコントローラーによってビュー名とビューデータを配信する良い方法を探しています。あなたが提案できるまったく異なる解決策も興味深いでしょう。フィルター、Web フォームなど。

更新:例を使用して、頭を包み込もうとしていることを説明しようと思います。ログイン機能を選択します。

典型的な Web フォーム アプリケーションでは、これは、ページのライフ サイクルのロード イベントで適切なデータを取得し、いくつかの UI コントロールを更新するユーザー コントロールである可能性があります。クリックすると、ページがポストバックされ、同じユーザー コントロールのクリック イベントでポストされた情報に基づいて行動できます。

ASP.NET MVC スタイルに関する私の現在の理解では、最初に要求を受け入れるコントローラーが適切なデータを取得し、それをビューに渡します。ビューはそれをログイン部分ビューに渡します。ログインビューは、投稿アクションがログインコントローラーのログインアクションに向けられるフォームを定義します。投稿された情報はlogin アクションによって使用され、気の利いたスキームを使用して元のコントローラーにリクエストを渡すことを選択できます。

ビュー/マスターページにコントローラーロジックを配置する必要のない、上記よりもスマートなアプローチがあると思います。

4

4 に答える 4

5

これを行うには、次の 2 つの方法があります。

1: これらのコンポーネントに必要なデータを常に取得する BaseController を作成し、ViewData["loginbox"] = loginBoxData を設定すると、そのように渡すことができます。

<% foreach (var component in GetComponents()) {%>
        <%= Html.RenderPartial(component.ViewName, ViewData[component.Name])%>
<%} %>

この方法の問題は、コンポーネントに必要なこれらすべてのデータがいつフェッチされ、いつフェッチされないかを示すロジックが必要なことです。

2:

ここからダウンロードできる MVC Futures DLL があります。

それを参照し、その名前空間を web.config に忘れずに追加すると、次のように言うことができるはずです: Html.RenderAction("blah")- このメソッドはコントローラーに接続して完全なトリップを行い、ビューを開始し、HTML を返します。

于 2009-01-18T09:17:26.070 に答える
2

マスター ページを使用し、ビュー コンテンツ ページとビュー ユーザー コントロールにコンテンツ プレースホルダーを使用できます。

ASP.NET MVC フレームワーク ベータ版の既定のプロジェクト テンプレートには、コンテンツの表示ページ用のコンテンツ プレースホルダーがあります。ページの右上隅には、ログイン/ログアウト リンク用の View User Control もあります。

コンテンツページを表示

ビュー コンテンツ ページは、見ているビューからのデータと共に使用されることになっています。Indexつまり、 のアクションをブラウズしている場合、サーバーはビュー コンテンツ ページHomeControllerをレンダリングします。Home/Index.aspx

マスター ページには、次の行が必要です。

<asp:ContentPlaceHolder ID="Holder1" runat="server" />

そして、ビュー コンテンツ ページ自体で、そのプレース ホルダーを次のように構成します。

<asp:Content ID="Content1" ContentPlaceHolderID="Holder1" runat="server">
  <p>This text goes to "Holder1" content place holder and
     I can access the ViewData.</p>
  <p><%= ViewData["Message"] %>
</asp:Content>

それぞれが id を介してasp:ContentPlaceHolderビューに対応します。asp:Contentしたがって、次のような複数のプレースホルダーが必要な場合:

<asp:ContentPlaceHolder ID="Holder1" runat="server" />
<asp:ContentPlaceHolder ID="Holder2" runat="server" />

…ビュー コンテンツ ページで次のように処理できます。

<asp:Content ID="Content1" ContentPlaceHolderID="Holder1" runat="server">
  <p>This text goes to "Holder1" content place holder</p>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Holder2" runat="server">
  <p>This text goes to "Holder2" content place holder</p>
</asp:Content>

ユーザー コントロールの表示

ビュー ユーザー コントロールは、表示しているビューに関係なく使用できます。ユーザー コントロールの表示の例を次に示します。これは、 View User Controls に関する Wekeroad のブログ投稿から抜粋したものです。ビュー ユーザー コントロールを使用するには:

<%=Html.RenderUserControl(“~/UserControls/UserList.ascx”)%>

必要に応じて、データと匿名型を渡すこともできます。

<%=Html.RenderUserControl(“~/UserControls/UserList.ascx”,ViewData.Users, new {GroupID=2})%>
于 2009-01-18T08:41:12.693 に答える
1

質問を正しく理解せずに、マスターページのアプローチをお勧めします。すなわち。マスターページにコンポーネントをレンダリングさせ、ページはマスターページから派生します。

しかし、これは良い答えではないのではないかと心配しています。私はこれを理解していません。

于 2009-01-17T10:43:54.507 に答える
0

これは古い質問ですが、かみそりでの私の見解は次のとおりです。

CQRS スタイルのアプリでは、ICommand を単一のサービス エンドポイントにプッシュすることができ、サービスはそれをルーティングする方法を見つけ出します。

これの良い例: https://github.com/ncqrs/ncqrs/blob/master/Framework/src/Ncqrs/Commanding/ServiceModel/CommandService.cs

コマンドを実行しようとする代わりに、クエリを実行しようとしていたということでしょうか。

1 の代わりに、IViewModelExecutor のリストとして 1 つ以上を渡しましたか?

メイン ページにはマスター ViewModel があり、そのサブ ViewModel ごとに定義があります。ページが読み込まれると、このビューに関連するすべてのビュー モデルを取得するようにサービスに要求します。

service.Load(new List<IViewModelExecutor>{UserinfoViewModel, UserAccountViewModel });

サービスは readmodel からデータをロードし、必要に応じてキャッシュします。サブビューモデルは、次を使用してサブビューに渡されますHtml.RenderPartial("subviewname", Model.SubViewModel)

サブビューは、モデルに基づいて自分自身をレンダリングする方法を知っています。

ここで、ajax の更新による構成 UI があるので、ページの UserAccount 部分を更新するとします。コントローラーには、その部分だけをレンダリングするアクションがあります。

からリクエストすることもできます。service.Load(new List<IViewModelExecutor>{UserAccountViewModel })

ビューモデルの必要な部分のみを取得します-おそらくキャッシュされます。パラメータがobvを変更しない限り。

これで、全体または一部を構築できる構成 UI ができました。

また、コンテンツ ネゴシエーションを使用して、リクエストの HTTP ヘッダーに応じて、HTML フラグメント、JSON、または XML を提供できます。

于 2012-02-04T01:54:09.157 に答える