ASP.NET MVC 3 Partial View в макете страницы

Я работаю над настройкой общего контента (навигации) для страницы макета MVC asp.net.

Вот мой частичный вид "_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( "Индекс", "Макет" );}, она выдает сообщение об ошибке "Ошибка выполнения дочернего запроса для обработчика" System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper "".

Чем я скучаю по друзьям? Как я могу вызвать частичный вид на странице макета?

Спасибо всем заблаговременно!

Ответ 1

Вместо:

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>

Ответ 2

Сначала убедитесь, что ваш дочерний вид находится внутри каталога Shared

@Html.Partial("_LayoutPartial")

ИЛИ

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

И не используйте @Html.Encode(), Razor уже делает для u. Просто используйте

@item.Name 
@item.URL

Ответ 3

Я решил эту ошибку получить на странице макета

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper

Важно! Сначала создайте частичный вид внутри общей папки

В контроллере

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

В макете страницы

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

Ответ 4

Я знаю, что это старый вопрос, но я думал, что брошу это здесь. Вы можете использовать либо Html.Action, либо Html.RenderAction. Они оба технически выполняют одно и то же, но в зависимости от того, сколько контента вы возвращаете назад, может повлиять на то, что вы действительно должны использовать для максимальной эффективности.

Оба метода позволяют вам вызвать метод действия из представления и вывести результаты действия на месте в представлении. Разница между ними заключается в том, что Html.RenderAction будет давать результат непосредственно в ответ (что более эффективно, если действие возвращает большое количество HTML), тогда как Html.Action возвращает строку с результатом.

Источник