在Razor语法中嵌套@的规则是什么?

时间:2014-10-22 23:31:08

标签: asp.net-mvc razor

我刚开始使用Razor(第3版)并且很好,但是当你需要使用@符号时,我不明白规则背后的原则。

这是我当前项目的一个例子。

在此代码中:

@if (ViewBag.ForcePublic == null && User.Identity.GetUserId() == @Model.Seller.Id)
        {                              
            <h2>Listing Status</h2>
            switch (Model.Status)
            {

如果我在switch语句前加上一个@,我会收到运行时错误,说我不需要嵌套@符号。

但是,在此代码中:

@if(!Model.BizAddress.StreetAddress.IsEmpty()) {
                 @Html.DisplayFor(model => model.BizAddress.StreetAddress);
            }

不仅会出现语法错误(正如人们所预料的那样,考虑上面的示例),如果我在Html.DisplayFor前面不包含@符号,我的StreetAddress就是没打印。相反,它默默地失败了!

我想了解为什么会发生这种情况,以便我可以避免将来可能导致的细微错误。

我怀疑根本原因与模板(我认为)类似于预处理器步骤这一事实有关,并且C#代码的范围仅在运行时已知,因此这两个示例在结构上是两个步骤发生后(预处理,编译和运行)相同。

1 个答案:

答案 0 :(得分:1)

Razor中的

@用于两个不同的目的:

1-您使用@字符表示使用Razor启动代码块。这类似于Web窗体中的<% %>

2-内联表达式(变量和函数)以@开头(用于在页面上书写内容)。这类似于Web窗体中的<%: %><% Response.Write() %>

在您的代码中,@之前的if字符表示代码块的开头。块的结尾是}块的结束if。您不需要也不允许@使用@之间的任何内容。但是,Html.DisplayFor()之前的{{1}}用于内联表达式。实际上,你不应该在该行的末尾加上分号,否则分号将显示在页面上的显示名称之后。

请查看此quick reference了解详情。