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
возвращает строку с результатом.
Источник