web-dev-qa-db-ja.com

レイアウトページのASP.NETMVC3部分ビュー

Asp.net MVCレイアウトページの共有コンテンツ(ナビゲーション)の設定に取り組んでいます。

これは、モデルからナビゲーションデータをプルするコードを含む私の部分ビュー「_LayoutPartial.cshtml」です。

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        //Test dump of navigation data
        @Html.Encode(item.Name); 
        @Html.Encode(item.URL); 

    }
</p>

これが私のコントローラー「LayoutController.cs」のコードがどのように見えるかです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyApp.Models.ViewModel;

namespace MyApp.Controllers
{
    public class LayoutController : Controller
    {

        //
        // GET: /Layout/

        LayoutViewModel layout = new LayoutViewModel();

        public ActionResult Index()
        {
            return View(layout);
        }

    }
}

これが「_Layout.cshtml」ページのコードです。ここでは、Html.RenderAction(Action、Controller)メソッドを使用して部分ビューを呼び出そうとしています。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <p>
        @{Html.RenderAction("Index","Layout");}
    </p>

    @RenderBody()
</body>
</html>

レイアウトページが@ {Html.RenderAction( "Index"、 "Layout");}行を実行すると、「ハンドラー 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'の子要求の実行中にエラーが発生しました」というエラーメッセージがスローされます。

友達がいないのは何ですか?レイアウトページで部分ビューを呼び出すにはどうすればよいですか?

よろしくお願いします!

11
Felasfaw

の代わりに:

public ActionResult Index()
{
    return View(layout);
}

行う:

public ActionResult Index()
{
    return PartialView(layout);
}

子アクションから通常のビューを返すときにこれを行わない場合、この通常のビューはレイアウトを含めようとします。これにより、子アクションがレンダリングされ、ビューが返され、レイアウトが含まれます。 、次に子アクションをレンダリングしようとします...そして、この同じサイトによって移植されたような名前になります。

また、パーシャルでは、ダブルエンコーディングを行う必要はありません。 @ Razor関数はすでにHTMLエンコードを行っています:

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        @item.Name 
        @item.URL
    }
</p>
18
Darin Dimitrov

まず、子ビューがSharedディレクトリ内にあることを確認します

_@Html.Partial("_LayoutPartial")
_

OR

_ @{Html.RenderAction("actionname", "controller name");}
_

そして、@Html.Encode()を使用しないでください。Razorはすでにuのためにやっています。使用するだけ

_@item.Name 
@item.URL
_
6
DotNet Dreamer

レイアウトページでこのエラーを解決しました

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper

重要!まず、共有フォルダー内に部分ビューを作成します

コントローラでは、

public PartialViewResult Userdetails()
{
   ....
   return PartialView("PartialViewName", obj);  
}

レイアウトページで、

@{Html.RenderAction("action","controller");}
2
Piyush Katkar

これは古い質問だと思いますが、ここに投げ込むと思いました。どちらかを使用できますHtml.ActionまたはHtml.RenderAction。どちらも技術的には同じことを行いますが、返されるコンテンツの量によっては、最高の効率を得るために実際に使用するコンテンツに影響を与える可能性があります。

どちらのメソッドでも、ビューからアクションメソッドを呼び出して、ビュー内に配置されているアクションの結果を出力できます。 2つの違いは、Html.RenderActionは結果を直接Responseにレンダリングします(アクションが大量のHTMLを返す場合はより効率的です)が、Html.Actionは結果とともに文字列を返します。

ソース

0
Quiver