空条件在Razor视图中是否起作用?

时间:2019-01-28 05:23:22

标签: c# razor razor-pages

我在Razor视图文件中:

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<pre>@Model.Exception.Message</pre>
<pre>@Model.Exception.InnerException?.Message</pre>
<pre>@Model.info</pre>

InnerException?.Message显示的内容多于Message属性。看起来像ToString()方法的输出:

enter image description here

如果我使用的不是空条件运算符,则使用:

@if (Model.Exception.InnerException != null)
{
  <pre>@Model.Exception.InnerException.Message</pre>
}

然后随心所欲地出来:

enter image description here

我为空条件运算符使用的语法不正确吗?

1 个答案:

答案 0 :(得分:0)

我认为发生此问题是因为在HTML标记之前使用了隐式Razor表达式:

<pre>@Model.Exception.InnerException?.Message</pre>

解释为这样,因此解析器仅读取Model.Exception.InnerException属性:

<pre>@(Model.Exception.InnerException.ToString())?.Message</pre>

在引入C#6.0之前,C#6.0及更高版本中的空条件运算符要求在某些Razor版本中使用显式表达式,因为隐式表达式解析器仍遵循以前的C#语法版本。由于显式表达式语法允许根据当前C#版本灵活地解析服务器端代码,因此上面的表达式应这样写:

<pre>@(Model.Exception.InnerException?.Message)</pre>

注意:

这是一个极端情况,Razor将空条件运算符误解为文字字符串的一部分,而不是带有隐式表达式的代码,而显式表达式有助于呈现属性内容。

参考:

Explicit Razor expressions

相关问题:

The new null-conditional operator in ASP.NET MVC Razor