Asp.Net MVC 3 - @Html.Action не будет отображать / возвращать HTML
Сегодня я перенес довольно новый проект из ViewPages в Razor, и, похоже, все идет хорошо. За исключением того, что я пытаюсь использовать Html.Action для рендеринга пользовательского элемента управления, и он ничего не рендерит.
Итак, у меня есть файл Shared/_Layout.cshtml, на который есть ссылка в Home / Index.cshtml
Index.cshtml имеет следующее:
<article>
@Html.Action("LatestBlogsMainPanelWidget", "Blogs")
...
</article>
Я поместил ловушки в BlogsController, так что я знаю, что запрашивается. Я также знаю, что модель возвращается, что LatestBlogsMainPanelWidget обнаруживается механизмом просмотра, и даже запускается некоторый фиктивный синтаксический код Razor: @{ var s = "hello"; }
но простой HTML в этом файле не попадает в браузер. Я пробовал и другие (ранее работавшие) партиалы, и они тоже не будут отображаться (просмотр источника на странице подтверждает, что его там нет).
Я также попытался заменить @ {Html.RenderAction (...); } безуспешно. По обе стороны от @Html.Action отображается HTML, поэтому я знаю, что Index.cshtml отображается правильно.
Еще более странно, что в файле _Layout также есть команды Html.Action, и они выглядят нормально.
Я действительно не уверен, что еще нужно проверить или как подтвердить, что конвейер получает HTML. Кто-нибудь может помочь вообще?
Спасибо!
4 ответа
Мозг - забавная штука, и, несмотря на то, что вчера я потратил несколько часов на это, моей собаке пришлось разбудить меня среди ночи на несколько минут, чтобы подсознание наткнулось на ответ.
Если это кого-то еще поставило в тупик, я не удивлюсь. Я не упомянул, потому что до меня не дошло, что я использую систему кэширования на частичном уровне, подобную той, что была разработана Стивом Сандерсоном. Внезапно меня поразило, что это может быть причиной, поскольку, насколько мне известно, страницы Razor проходят гораздо меньше конвейерной обработки, чем страницы WebForm. Фильтр кэширования, вероятно, не выполняет то, что ему нужно, или в нужное время.
Я подтвердил, что комментирование фильтра OutputCache для рассматриваемых действий решило проблему.
Я понятия не имею, является ли эта проблема верной для кэширования на уровне страницы, поскольку это не то, что я считаю полезным.
Поместите Layout = null в частичное представление, и оно будет работать нормально.
Попробуй это:
@ {Html.RenderAction ("LatestBlogsMainPanelWidget", "Blogs");}
При поиске решений этой проблемы я обнаружил три проблемы измерения для неправильного рендеринга Html.Action и Html.RenderAction. Пожалуйста, проверьте, правильно ли вы сделали ниже, или нет.
- В вашем PartialView или View вы определили @ {Layout = null;}.
- Используйте возврат PartialView вместо View.
- Украсьте свое действие атрибутами [ChildActionOnly].
Я надеюсь, что, применяя все вышеперечисленные шаги, вы сможете решить свои проблемы.