Подтвердить что ты не робот

Новый оператор с нулевым условием в ASP.NET MVC Razor

Так как С# 6.0 вышел, я довольно часто использовал оператор с нулевым условием. Пример:

Model?.Person?.Zip

Однако теперь у меня есть ситуация, когда у меня есть решение, где клиент работает с моделями домена в представлении. Хотя я бы выследил разработчика топором, мне легче просто выполнить некоторые нулевые проверки в представлении.

Однако, когда я иду в Razor:

@Model?.Person?.Zip

My Model? рассматривается как динамический, но ? ломает динамические вещи, а отдых отображается как текст.

Как вы решаете это?

4b9b3361

Ответ 1

Просто угадать

@(Model?.Person?.Zip)

Ответ 2

Для некоторой дополнительной полноты (я работаю над командой ASP.NET в Microsoft):

Как правильно заметил Дитер Б (и некоторые другие), @(Model?.Person?.Zip) будет работать.

Синтаксис @(...) можно рассматривать как синтаксис "escape", который обеспечивает гораздо большую гибкость, с точки зрения которого код будет анализироваться как выражение.

Когда была создана текущая версия Razor, был только С# 5, поэтому новые синтаксисы С# 6 не поддерживались напрямую.

Команда ASP.NET хочет вернуть обратно часть Razor v4 (используется в ASP.NET 5/MVC 6) для С# 6 обратно в Razor v3 (используется в ASP.NET 4.x/MVC 5).

Ответ 3

Это также может произойти, если вы пропустили один или оба из следующих пакетов NuGet из проекта:

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  • Microsoft.Net.Compilers

Ответ 4

Просто измените целевую платформу на .NetFramework 4.7 и установите эти пакеты с помощью диспетчера пакетов Nuget:

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  • Microsoft.Net.Compilers

Затем используйте его следующим образом (обратите внимание на круглые скобки, которые допускают полный синтаксис С#, а не частичный синтаксис Razor):

@(Model.Country?.Name)