2

私は MVC 3 を使用してプロトタイプ プロジェクトを作成していますが、答えが見つからないように見える状況に遭遇しました。問題に間違った方法でアプローチしているようです。

私のプロジェクトの簡単な概要; これは、Visual Studio で取得した MVC テンプレートに基づいており、提供されている _Layout ビューのリンク (タブ) を使用して、他のいくつかのビューにアクセスします。これらのリンクの 1 つが 2 番目の部分ビューを開きます。このビューには、さらに多くのビューへのリンクが含まれています (管理者固有のため、分割)。私が抱えている問題は@RenderBody、2 番目の部分ビューでビューを表示できないように見えることです。これは、完成した HTML ファイルに複数のビューを含めることができないためです@RenderBody。これは理にかなっています。

私の質問は、この方法でビューを表示するにはどうすればよいですか? また、おそらくもっと重要なことですが、これは私が試みているこの「サブメニュー」システムを達成する正しい方法ですか、それともこれを達成するためのより良い方法はありますか?

ビューの関連部分は次のとおりです。最初は「メイン」_Layout ファイルです。

<body>
    <div class="page">
        <header>
            <div id="title">
                <h1>Test App</h1>
            </div>
            <nav>
                <ul id="menu">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    @if (User.Identity.IsAuthenticated)
                    {
                        <li>@Html.ActionLink("Contracts", "List", "Contract", new { user=User.Identity.Name, page=1 }, null)</li>
                    }
                    @if (User.IsInRole("Administrator"))
                    {
                        <li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>
                    }
                </ul>
            </nav>
        </header>
        <section id="main">
            @RenderBody()
        </section>
        <footer>
        </footer>
    </div>
</body>

<li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>リンクをクリックすると、Home コントローラーは以下に示す 2 番目の部分ビューを返します。

<header>
    <div id="admintitle">
        <h1>Administration</h1>
    </div>  
</header>
<body>
    <div id="div-1a">
         <nav>
            <ul id="adminmenu">
                <li>@Html.ActionLink("Contact", "List", "Contact")</li>
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
            </ul>
        </nav>
    </div>
    <div id="div-1c">
        <h1>Test</h1>   
    </div>
    <section id="adminmain">
        @RenderBody()
    </section>
</body>

コードを実行しようとすると、2番目の が原因で失敗しますが@RenderBody、これは理解できます。

さらに情報が必要な場合は、お知らせください。

どうもありがとう。

4

4 に答える 4

6

@RenderBody()複数回のご利用はできません。@RenderBody()メインの _Layout ファイルに1 つあれば十分です。2 番目のビューでは、代わりに@RenderPartial()またはを使用します@RenderAction

更新(最初のコメントに基づく)

/Administrator/TheActionをレンダリングしたいとしましょう。

@{
    Html.RenderAction("TheAction", "Administrator");
}

TheActionアクションは次のようになります。

public PartialViewResult TheAction() {
    return PartialView();
}

~/Views/Administrator/TheAction.cshtmlそして、あなたが呼び出した場所のすぐ内側にビューをレンダリングしますRenderAction().

重要なのは、それが別のことを達成しないこと@RenderBodyです。TheAction()例でわかるように、ヘルパーを持たないPartialViewResult@RenderBody()を返しています。

于 2012-08-10T08:19:38.717 に答える
3

変換

から

<section id="adminmain">
   @RenderBody()
</section>

   <div id="adminmain"></div>

から

@Html.ActionLink("Contact", "List", "Contact")

@Ajax.ActionLink("Contact", "List", "Contact", new AjaxOptions { UpdateTargetId = "adminmain" })

そして、'View()' の代わりにContactController List実際に戻ります。PartialView()

jquery.unobtrusive-ajax機能させるために、ビューに含めることを忘れないでくださいAjax

そしてすべての前にローマの答えを読んでください

于 2012-08-10T09:07:28.327 に答える
0

MVC4 でネストされた部分ビューを操作しているときに、興味深いことに出会いました。誰かがこれに出くわした場合に備えて..

ループで部分ビューをレンダリングする場合、

@Html.Partial()

動作しません。

代わりに@Html.RenderPartial(); 、前者の場合にエンコードされた HTML の代わりに HTML を出力して動作するものを使用します。

乾杯!

于 2014-05-10T16:18:59.527 に答える
0

@Roman Mazur と @Mohayemin の両方の回答を AJAX 呼び出しに組み込んだソリューションを見つけました。

ローマンが提案したように、ビューを次のように変更しました。

public PartialViewResult List() {
    return PartialView();
}

次に、Mohayemin が提案したように、セクションを div に変更しました。

<div id="adminmain"></div> 

次に、クリック イベントで AJAX スクリプトを呼び出すリンクを作成しました。

<li><a id="load-partial">CONTACTS</a></li>

<script>
$(document).ready(function () {
    $('#load-partial').click(function () {
        $.ajax({
            url: '/Contact/List/',
            datatype: 'html',
            success: function (data) {
                $('#adminmain').empty().html(data);
            }
        });
    });
});
</script>

それはうまく機能しますが、私はそれを改善する方法についてのより多くの提案をいつでも受け入れています.

どうもありがとう。

于 2012-08-10T19:29:16.160 に答える