2

そのレイアウト内に部分ビューを使用したレイアウトページがあります。部分ビューには、作成したメニュー機能が含まれています。メニューを部分ビューに分割して、保守が容易になるようにします。メニューはすべてのページで使用されるため、意図的にレイアウトに配置されていますが、メニューには条件付き要素があり、一部のオプションは特定のページにのみ表示されます。

私は前進するために何が問題になるかを見つけました。メニューはajax呼び出しを使用して、コンテンツを含む部分ビューをレンダリングします(ページの読み込みを減らします)会社を含むページで作業していたところ、会社には連絡先のリストが含まれています、クリックするとメニューオプションに連絡先のリストが表示されます。すでに会社モデルで連絡先リストを読み込んでいますが!メニューがレイアウトページに含まれる部分ビューであり、モデルを受け入れることができないため、連絡先リストをレンダリングする必要がある新しい部分ビューからアクセスできません。そのため、モデルを部分ビューに渡すことができません。メニューの部分ビューがレイアウトページにあるため、ロードしようとしています。

これは厄介な状況です。レイアウトを変更して、メニューを含む新しいセクションをレンダリングして、新しいビューモデルをそのセクションに渡すことができますが、作成するすべてのページでメニューを参照する必要があります(なんと害虫です!)。ここで何かが欠けている必要があります(これが私の最初のMVC3アプリケーションである可能性が高いことを考慮して)。助言がありますか?

編集:私はこれを自分でさらに進めました。つまり、メニューを含む部分ビューもそのデータにアクセスできるため、レイアウトページは常にそれを使用するページのモデルにアクセスできます。メニューの部分ビューに、ページをチェックして必要に応じてデータを渡す条件付きロジックを記述しました。

<div class="menu">    
    <ul>
        <li><a href="@Url.Action("Create", "Contact")">New Contact </li>
        <li><a href="@Url.Action("Index", "Contact")">Contact List </a></li>
    </ul>
    @if (Request.Url.PathAndQuery.Contains("/Contact/Details/"))
    {
        <ul>
            <li>@Html.ActionLink("New Activity", "Create", "Activity", new { companyid = 0, contactid = Model.contact.id }, null)</li>
        </ul>
    }
</div>

上記はメニューの部分ビューの小さなサンプルですが、メニューが連絡先/詳細ページ用に作成され、model.contact.idを渡すことができる1つの例が含まれています。メニューとレイアウトにモデルが明示的に含まれていないという点で機能しますが、あまりきれいに感じられません。

4

1 に答える 1

5

私があなたの質問を正しく理解している場合、あなたの問題は、レイアウトにモデルを持たせたくないので、部分ビューにモデルを含めることができないと思うことです。したがって、問題は、レイアウトで使用するこの基本モデルタイプを拡張するためにすべてのアクションを必要とせずに、どのようにしてモデルをレイアウトに組み込むことができるかということです。

Html.Partial1)メニューのレイアウトで使用する代わりにHtml.Action、メニューデータをフェッチするアクションメソッドを使用します。

2)カスタムWebViewPageを作成し、次のようなプロパティを含めます

return ((BaseController)ViewContext.Controller).MenuData;

これで、部分ビューにモデルが必要なくなり、データに直接アクセスできるようになりました。

これらは両方とも、ベースモデルで利用可能なすべてのメニュー情報を含むMenuプロパティを持っている必要がありますが、Webサイトのすべてのページがこのデータにアクセスする必要がある場合は、それが適切と思われます。

編集:整理整頓の懸念に応えて、適切なビューページまたはサブレイアウトのいずれかでメニューの一部をカスタマイズする機能を提供するセクションが必要なようです。

セクションの概要とhttp://については、http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspxを参照してください。ネストされたレイアウト/セクションの情報については、 blogs.msdn.com / b / marcinon / archive / 2010/12/15 /razor-nested-layouts-and-redefined-sections.aspxを参照してください。

于 2012-04-14T20:33:27.947 に答える