2011-05-04 6 views
3

Если я использую следующий метод контроллера:Бритва Частичный вид не Rendering

public ActionResult Menu() 
{ 
    // do stuff... 

    return PartialView("viewName", navLinks); 
} 

вызывая частичный вид в _Layout.cshtml вроде этого:

<div id="categories"> 
    @{ Html.Action("Menu", "Nav"); } 
</div> 

Со следующим ASCX частичный вид:

<%@ Control Language="C#" 
    Inherits="ViewUserController<IEnumerable<MyDataType>>" %> 

<% foreach(var link in Model) { %> 
    <%: Html.Route.Link(link.Text, link.RouteValues) %> 
<% } %> 

все работает нормально. Ура.


НО, если я использую одно из следующей частичного вида бритвы:

@model IEnumerable<MyDataType> 

@foreach(var link in Model){ 
    Html.RouteLink(link.Text, link.RouteValues); 
} 

или ...

@model IEnumerable<MyDataType> 

@{ 
    Layout = null; 
} 

@foreach(var link in Model){ 
    Html.RouteLink(link.Text, link.RouteValues); 
} 

я ничего не получаю. нет никакого исключения, я просто ничего не получаю. Я знаю, что проблема не в методе контроллера (он отлично работает с частичным представлением ASCX).

Что здесь происходит?

ответ

5

Метод RenderAction записывает действие непосредственно в представление и возвращает void.
Метод Action возвращает содержимое действия, но ничего не записывает в представление.

Написание @something напечатает значение something на странице.
Вы не можете написать @Html.RenderAction, так как RenderAction ничего не возвращает.

Письмо Html.Action(...) (без @) обычно вызывает этот метод, но не делает ничего с его возвращаемым значением.

+0

спасибо, очень хорошее объяснение. Несомненно, я буду ссылаться на это снова для дальнейшего использования. – Didaxis

6

Попробуйте изменить это:

@foreach(var link in Model){ 
    Html.RouteLink(link.Text, link.RouteValues); 
} 

к этому:

@foreach(var link in Model){ 
    @Html.RouteLink(link.Text, link.RouteValues); 
} 

Похоже, без @ метод вызывается, но возвращаемое значение просто быть dscarded. Помещение @ заставляет его записываться в ответ.

+0

@ Danny - ваши предлагаемые изменения не отображали содержимое. – Didaxis

+0

О, я думаю, что я также удалил фигурные скобки из «@ {Html.Action (« Меню »,« Nav »);}» или изменил его на RenderAction вместо Action. Возможно, это была комбинация обоих изменений. Если нет, я попробую еще раз, когда вернусь домой. –

+1

Да, мне приходилось делать обе вещи - удалить фигурные скобки "@Html.Action (blah) ", а также добавьте @ перед" @ Html.RouteLink ". Первое изменение останавливает код, поэтому возвращаемое значение Action получает выход (RenderAction также будет работать, но он напрямую записывает ответ). –

1

OK, Изменение способ был вызван из _Layout.cshtml работал ...

<div id="categories"> 
    @Html.Action("Menu", "Nav"); 
</div> 

Важно отметить, что @ Html.RenderAction не работает для меня. Мне бы очень понравилось объяснение здесь, потому что прямо сейчас изучение Razor расстраивает меня, потому что есть небольшая документация, и проблемы, подобные этим, которые требуют минут, чтобы решить, слишком долгое время питаются.

+0

Я использую MVC3 и просто столкнулся с этим, что я считаю ошибкой @ {Html.RenderPartial (...);} с страницы _Layout ничего не делает. Если я использую @ Html.Partial (....) вместо этого (т. Е. Верните строку и вне ее, вместо этого использования метода RenderPartial, который записывается непосредственно в поток ответов) Я вижу результат моего Render Partial. Если я переместил код RenderPartial на (т. е. не страницы _Layout), то он работает так, как ожидалось. Итак, я думаю, что это ошибка, которую вы не можете использовать RenderPartial() на странице _Layout. – Andrew

Смежные вопросы