2011-05-04 147 views
3

如果我使用下面的控制器方法:剃刀局部视图不渲染

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) %> 
<% } %> 

一切工作正常。好极了。


,但如果我用以下任一RAZOR部分观点:

@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 2011-05-04 14:11:10

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

@丹尼 - 您的建议更改不会呈现内容。 – Didaxis 2011-05-04 10:57:33

+0

哦,我想我也可能已经从“@ {Html.Action(”Menu“,”Nav“);}”中删除了你的大括号,或者将它改为RenderAction而不是Action。也许这是两种变化的结合。如果不是,当我回家时我会再试一次。 – 2011-05-04 12:07:30

+1

是的,我不得不做两件事 - 删除大括号“@Html。Action(blah)“,并在@ Html.RouteLink前面添加@第一个改变停止了代码,所以Action的返回值得到输出(RenderAction也可以工作,但它直接写入响应)。 – 2011-05-04 16:34:05

1

OK,改变它从_Layout.cshtml所谓的工作方式......

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

重要的是要注意,@ Html.RenderAction不适合我的工作是非常重要的。我真的很喜欢这里的一些解释,因为现在,学习Razor让我感到很沮丧,因为几乎没有文档,像这些需要几分钟才能解决的问题正在消耗我太多的时间。

+0

我使用MVC3,刚刚遇到这个,我认为是一个错误 @ {Html.RenderPartial(...);} from _Layout page does not do。 如果我使用@Html.Partial(....)来代替(即返回一个字符串,使用RenderPartial方法直接写入响应流)我看到了我的Render Partial的结果 如果我将RenderPartial代码移动到控制器的视图(即不是_Layout页面),那么它按预期工作。 所以我认为它是一个bug,你不能在_Layout页面中使用RenderPartial()。 – Andrew 2011-05-27 13:19:44