Razor部分视图无法渲染

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局部视图时效果非常好)。这里发生了什么?
3个回答

6
尝试更改这个:
@foreach(var link in Model){
    Html.RouteLink(link.Text, link.RouteValues);
}

转换为:

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

没有 @ 符号,方法被调用,但返回值被丢弃。加上 @ 符号,才会将其写入响应中。

@Danny - 你建议的更改没有呈现内容。 - Didaxis
哦,我想我可能还从“@{ Html.Action("Menu", "Nav"); }”中删除了你的大括号,或者将其更改为RenderAction而不是Action。也许这是两种变化的结合。如果不是,我回家后会再试一次。 - Danny Tuppeny
1
是的,我必须做两件事 - 删除大括号“@Html.Action(blah)”,并在“@Html.RouteLink”前面添加“@”。第一个更改停止代码,以便输出Action的返回值(RenderAction也可以工作,但它直接写入响应)。 - Danny Tuppeny
没问题,很高兴你解决了它 :-) - Danny Tuppeny

5
RenderAction方法直接将动作写入视图并返回void
Action方法返回动作的内容,但不会将任何内容写入视图。
写入@something会在页面上打印出something的值。
你不能写@Html.RenderAction,因为RenderAction不返回任何内容。
写入Html.Action(...)(没有@)通常调用该方法,但不会对其返回值做任何处理。

谢谢,非常好的解释。毫无疑问,我将来会再次参考这个。 - Didaxis

1

好的,从_Layout.cshtml调用的方式改变了...

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

需要注意的是,@Html.RenderAction 对我来说不起作用。我真的很希望在这里得到一些解释,因为现在学习 Razor 让我感到沮丧,因为文档很少,而像这样的问题本应该只需要几分钟就能解决,但却花费了我太多的时间。


我正在使用MVC3,遇到了一个我认为是bug的问题。在_Layout页面中使用@{ Html.RenderPartial(...); }没有任何效果。如果我改用@Html.Partial(....)(即返回一个字符串并输出它,而不是使用直接写入响应流的RenderPartial方法),我就可以看到我的Render Partial的结果。如果我将RenderPartial代码移动到控制器的视图中(即不是_Layout页面),那么它会按预期工作。因此,我认为在_Layout页面中无法使用RenderPartial()是一个bug。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接