问题 在else和{之间发表评论


我刚开始使用Razor而不是WebForms-ViewEngine。现在在我的Razor-View中我有这样的事情:

@{
  int i = 42;
  string text;
  if (i == 42)
  {
    text = "i is 42!";
  }
  else //i is not 42 //<- Error here
  {
    text = "i is something else";
  }
}

我得到一个警告,并在运行时它在else行中得到一个异常:

预期“{”但找到“/”。块语句必须用“{”和“}”括起来。您不能在CSHTML页面中使用单语句控制流语句。

显然,编译器不喜欢else和{之间的注释。我也尝试用@ *和/ *进行评论,它给出了类似的错误消息。

反正有没有像我想要的那样在剃刀上发表评论?


免责声明:

是的我知道我可以像这样解决它:

@{
  int i = 42;
  string text;
  if (i == 42)
  {
    text = "i is 42!";
  }
  else
  { //i is not 42
    text = "i is something else";
  }
}

但是它不符合我们的编码指南,并且对同一行的评论使我的意图更加明确。


5492
2018-01-05 09:35


起源

您的编码指南要求您对每个人进行评论 else 声明,含有对前述的否定 if?你是做什么的? if ... else if ... else if ... else 链? - Richard Everett
不,只是在if的最后一次检查值列表时,可能在将来扩展。例如 if(val == Enum.Val1){...} else if(val == Enum.Val2){...} else //must be Enum.Val3, though Val4 might be added in the future - void


答案:


这就是Razor解析器的构建方式。如果您不喜欢它的方式,您可以随时在MS连接上提交错误/功能请求,并希望人们会投票支持它,它将在未来版本的解析器中修复/实现。我个人不会因为我不在乎(见下面原因)。

这就是说,为什么要关心?我的意思是你不应该在Razor页面中编写代码。 Razor页面旨在用作视图。在ASP.NET MVC中,视图用于显示视图模型中的一些信息,这些信息是从控制器操作传递给它的。标记主要,与HTML帮助器混合并显示视图模型中的信息。但是C#代码是不行的。所以你所说的  你在问题中显示的内容在Razor视图中严格无关。


12
2018-01-05 09:41



我同意Darin的观点。如果视图中有这么多代码,则意味着您的模型很弱。您可以轻松地将此逻辑移动到模型中。 - Sedat Kapanoglu
嗯,我的例子并没有真正显示我试图做的事情,在我的真实代码中我根据某些条件写出文本。但是你是对的并不重要我只是偶然发现这个限制WebForms没有,所以我虽然错过了一些东西。 - void
@NULL,然后将代码从您的真实示例移动到帮助器,控制器,模型......,具体取决于它的目的。 - Darin Dimitrov
@Darin:我没有考虑到这个相对简单的逻辑,但这是一个好主意。谢谢! - void
@DarinDimitrov:只是一个愚蠢的问题,我尝试过使用@ ** @ comments,在VS2010编辑器中没有错误消息,但令人惊讶的是,在渲染视图时它会以相同的语法错误轰炸出来。是不是@ ** @评论应该在渲染之前以某种方式被删除? - BigMike