ASP.NET MVC 3: проблема с несколькими Html.RenderAction () - PullRequest
7 голосов
/ 06 июля 2011

Я столкнулся с проблемой ASP.NET MVC 3 с механизмом рендеринга Razor (C #).Я использую несколько Html.RenderAction() методов в представлении, и отображается только макет.

Одно важное замечание перед продолжением: я не могу скопировать любой код, потому что у меня нет прав на интеллектуальную собственностьтак.: (

Во всяком случае, я заметил, что если бы я использовал следующий синтаксис @{ RenderSection("SectionName", true); } вместо @RenderSection("SectionName", true), было общее исключение, которое просто говорит о том, что он не смог отрендерить секции с трассировкой стека, которая казаласьскажем, что может быть какая-то асинхронная проблема. Между тем, я использую синхронные контроллеры, так что, возможно, это лидерство, но я не знаю много о синхронных / асинхронных контроллерах и когда их следует использовать для определенных ситуаций.

Чтобы поместить все в контекст, вот что я пытаюсь сделать в коде / псевдокоде / структуре сайта ...

~ / View / Shared / _ViewStart.cshtml

(Selects a layout according to certain conditions.)

~ / View / Shared / _Layout1.cshtml

<! doctype HTML>
<html>
    <head>
        <!-- some irrelevant content here... -->
    </head>

    <body>
        <div id="page">
            <div id="header">
                @RenderSection("Header", true)
            </div>

            <div id="content">
                <div id="main1">
                    @RenderSection("Table1", true)
                    @RenderSection("Table2", true)
                </div>

                <div id="main2">
                    @RenderSection("Content", true)
                </div>
            </div>

            <div id ="footer">
                @RenderSection("Footer", true)
            </div>
        </div>
    </body>
</html>

~ / View / Shared / _Layout2.cshtml

(another layout)

~ / View / Controller1 / Action1.cshtml

@section Header
{
    @RenderPage("~/Views/Shared/Sections/Header")
}

@section Footer
{
    @RenderPage("~/Views/Shared/Sections/Footer")
}

@section Table1
{
    @{ RenderAction("Table1", "Table");  }
}

@section Table2
{
    @{ RenderAction("Table2", "Table");  }
}

@section Content
{
    @{ RenderAction("Action", "Content"); }
}

~ / View / Controller1 / Action2.cshtml

(similar to Action1.cshtml)

~ / Utilities / ModelManager.cs

public abstract class ModelManager : Controller
{
    //Some useful code for controllers here...
}

~ / Controller / Controller1.cs

public class Controller1 : ModelManager
{
    #region Get Methods

    public ViewResult Action1()
    {
        return View();
    }

    public ViewResult Action2()
    {
        return View();
    }

    #endregion  

    #region Post Methods

    public ViewResult Action1(FormCollection form)
    {
        return View();
    }

    public ViewResult Action2(FormCollection form)
    {
        return View();
    }

    #endregion
}

~ / Controller / Controller2.cs

(another controller similar to Controller1)

~ /Controller / Table.cs

(Only important thing to note is that the actions are returning PartialViewResult.)

~ / Controller / Content.cs

(Only important thing to note is that the action is returning PartialViewResult.)

~ /Model / Entities.edmx

(Generated with Entity Framework Wizard.)


* Редактировать *

Работает @Html.Action(...), но мне бы очень хотелось узнать, почему @Html.RenderAction(...)не работалЛюбые предложения приветствуются.:)

Ответы [ 3 ]

13 голосов
/ 06 июля 2011

В качестве альтернативы я бы предложил попробовать переключиться на:

@Html.Action("actionMethod","controller")

Этот помощник расширения работает аналогично RenderAction, но возвращает MvcHtmlString вместо прямой записи в буфер вывода (поток ответа).

Html.RenderAction - это метод, возвращающий void.Таким образом, вы должны поставить ";"в конце.Что касается исключения, вы можете попробовать отладить его и посмотреть, какие переменные установлены и т. Д., Если вы хотите придерживаться этого вспомогательного метода.

Надеюсь, это поможет.

0 голосов
/ 13 декабря 2013

Для RenderAction, вы должны поместить его с фигурной скобкой, как показано на рисунке

@{Html.RenderAction(...);}

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 01 августа 2011

Попробуйте это:

@section Table1
{
    RenderAction("Table1", "Table");
}
...