должен ли я использовать @html.renderpartial или @html.renderaction

Я пытаюсь ввести свое меню.

На моей странице _Layout.cshtml у меня есть

<div class="wrapper">
                <!-- Navigation -->

                  @Html.RenderAction("Navigation", "Nav")

Навигатор выглядит так

public ActionResult Navigation()
{
    var pages = pageRepository.Pages;
    return View(pages);
}

Вид навигации выглядит так

@model IEnumerable<Site.Domain.Entities.Page>
@{
    Layout = null;
    List<Site.Domain.Entities.Page> pages = new List<Site.Domain.Entities.Page>();

    foreach(var page in Model)
    {
        pages.Add(page);
    }
}

@foreach (var link in Model)
{
    if (link.ParentPage == "Home")
    { 
    <li>@link.PageTitle</li>
    <ul>
        @foreach (var subLink in pages)
        {
            if (subLink.ParentPage == link.PageTitle)
            { 
            <li>@subLink.PageTitle</li>
            }
        }
    </ul> 

    }
}

Представление работает нормально, когда я иду в .../nav/navigation

Что я пытаюсь сделать, так это перенести это на мою страницу _Layout, чтобы я мог использовать ее в качестве своего меню.

Я продолжаю получать сообщение об ошибке с @Html.RenderAction("Navigation", "Nav")

В сообщении об ошибке "Лучший перегруженный метод, соответствующий "System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)", имеет недопустимые аргументы"

Должен ли я использовать это как частичное? Каков наилучший способ сделать это? Спасибо за любой совет!


person haydnD    schedule 25.01.2013    source источник
comment
Используйте отладчик, чтобы найти, что происходит.   -  person leppie    schedule 25.01.2013


Ответы (2)


Для того, что вы пытаетесь сделать, @Html.RenderAction(..) является правильным вызовом. RenderAction – это ChildActionExtension, и вам нужно будет добавить этот атрибут в контроллер.

Ваш контроллер должен выглядеть примерно так, как показано ниже. Обратите внимание, что вы также захотите вернуть PartialView.

[ChildActionOnly]
public ActionResult Navigation()
{
    var pages = pageRepository.Pages;
    return PartialView(pages);
}

Действие Render не возвращает HTML, а добавляет содержимое в ответ. При этом ваше представление должно выглядеть так:

@{@Html.RenderAction("Navigation", "Nav");}

Ссылка: http://msdn.microsoft.com/en-us/library/ee721274(v=vs.108).aspx

person anAgent    schedule 25.01.2013
comment
Пожалуйста, не используйте secon@ в MVC5. Правильный синтаксис: @{Html.RenderAction(Navigation, Nav);} - person Karl; 24.01.2018
comment
@{Html.RenderAction(Navigation);} синтаксис для отображения действия - person PAWAN RAJ Shakya; 23.04.2018

Поскольку Html.RenderAction является пустым и не возвращает значение, вам нужно «экранировать» вызов с помощью фигурных скобок.

@{Html.RenderAction("Navigation", "Nav");}

Вместо этого в вашем контроллере вы должны вернуть частичное представление.

public ActionResult Navigation()
{
    var pages = pageRepository.Pages;
    return PartialView(pages);
}
person David L    schedule 25.01.2013
comment
Просто используйте @Html.Action(Navigation,Nav) в MVC5 - person Karl; 24.01.2018