2011-03-27 156 views
2

当我使用partial view(MVC3/Razor)时,会出现这个问题,但我相信 - 这是清晰的Razor语法问题,不直接与局部视图相关。 所以 - 我有局部视图Menu.cshtml全标记为:ASP.NET MVC 3剃刀语法问题

@model IEnumerable<SportsStore.WebUI.Models.NavLink> 
@foreach(var link in Model) 
{ 
    @Html.RouteLink(link.Text, link.RouteValues); 
} 

没问题 - “家长”视图叫它@ {Html.RenderAction(“菜单”,“导航”);}和所有的工作作为魔术。 但是,如果我将编辑Menu.cshtml为:

@model IEnumerable<SportsStore.WebUI.Models.NavLink> 
@foreach(var link in Model) 
{ 
    Html.RouteLink(link.Text, link.RouteValues); 
} 

(!见 - NO '@' Html.RouteLink)之前都只是朗声道:现在@ {Html.RenderAction( “菜单”,“导航“);}输出完全是空的,没有一个HTML标签。

想知道 - 两段代码有什么区别?我假设@之前foreach也自动“落入”并适用于Html.RouteLink以及?所以 - 我错了吗?

+0

你先生,是我的英雄。我正在通过看起来同样的SportsStore文章,但我正在转换到VB.Net。 C#和VB之间的转换通常是微不足道的,但使用Razor可能会非常棘手。我在RouteLink中遇到了同样的问题,不能创建输出,看起来VB.Net遭受同样的缺陷(阅读:应用相同的逻辑)......我添加了“@”,并且所有的事情都再次被点击了。谢谢@Smarty – Smudge202 2011-08-03 12:25:11

回答

3

语句之前的@使得它被写入输出流。当你删除它时,你所做的只是调用Html对象的方法调用。

@操作者的目的是双重的。它可以用来将输出表达式输出到响应流中,就像您在第一个示例中看到的那样。另一个功能是启动一个代码块。您可以看到代码示例中使用的第二种行为:@foreach(var link in Model)

+0

就是这样!现在我对@运营商充满信心。 :) – Smarty 2011-03-28 11:02:44

3

Html.RouteLink方法仅返回包含链接的IHtmlString;它不会做任何其他事情。

当您编写@Html.RouteLink(...)时,您将打印此页面的链接。
当你编写Html.RouteLink(...)时,你在调用方法时没有对链接做任何事情。
因此,没有任何反应。

+0

非常好的解释,非常感谢!这是一个遗憾,我不能用绿色标记标记答案。 – Smarty 2011-03-28 11:02:25