【问题标题】:ASP.NET MVC 3 Razor Syntax questionASP.NET MVC 3 Razor 语法问题
【发布时间】:2011-03-27 16:36:19
【问题描述】:

当我使用局部视图 (MVC3/Razor) 时会出现这个问题,但我确信 - 很明显 Razor 语法问题,与局部视图没有直接关系。 所以 - 我有完整标记的部分视图 Menu.cshtml:

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

没问题 - “父”视图将其称为 @{Html.RenderAction("Menu", "Nav");} 并且所有这些都像魔术一样工作。 但是,如果我将 Menu.cshtml 编辑为:

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

(请参阅 - Html.RouteLink 之前的 NO '@'!)都刚刚中断:现在 @{Html.RenderAction("Menu", "Nav");} 输出完全为空,没有一个 HTML 标记。

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

【问题讨论】:

  • 您先生,是我的英雄。我正在处理看起来似乎相同的 SportsStore 文章,但我正在快速转换为 VB.Net。 C# 和 VB 之间的转换通常很简单,但使用 Razor 可能会很棘手。我在 RouteLink 没有创建输出时遇到了同样的问题,似乎 VB.Net 也有同样的缺陷(阅读:应用相同的逻辑)......我添加了 @ 并且一切都再次启动。谢谢@Smarty

标签: asp.net syntax asp.net-mvc-3 razor


【解决方案1】:

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

@-operator 的目的有两个。它可以用于将表达式输出到响应流,就像您在第一个示例中看到的那样。另一个功能是启动代码块。您可以使用@foreach(var link in Model)

查看代码示例中使用的第二种行为

【讨论】:

  • 就是这样!现在我对@运算符充满信心。 :)
【解决方案2】:

Html.RouteLink 方法只返回一个包含链接的IHtmlString;它没有做任何其他事情。

当您写 @Html.RouteLink(...) 时,您正在打印该页面的链接。
当您编写 Html.RouteLink(...) 时,您正在调用该方法而不对链接进行任何操作。
因此,什么也没有发生。

【讨论】:

  • 很好的解释,非常感谢!很遗憾我不能用绿色标记两个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2019-05-13
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多