Строковая интерполяция в представлении Razor?


93

Это поддерживается?

Если да, есть ли какой-нибудь трюк для его включения? Я предполагаю, что Razor не использует достаточно новый компилятор ...? IDE VS2015, кажется, в порядке, но во время выполнения я получаю

CS1056: Неожиданный символ "$"


Вы можете показать код, о котором говорите?
Jeroen Vannevel

Какой ASP.NET вы используете (ASP.NET 5: новый, построенный на .NET Core; или обновление до ASP.NET 4)?
Ричард

1
Спасибо! Я рад, что это сказал кто-то другой. Я думал, что это было очень полезно, и я лично знаю двух человек, у которых была такая же проблема с тем же решением. Кто, черт возьми, здесь главный ??
Тим Шмидт

@TimSchmidt Очередь закрытия длинная, поэтому иногда вопросы закрываются некорректно. Но очередь повторного открытия короткая, поэтому, если ее действительно нужно открыть повторно, это будет довольно быстро.
o11c

Ответы:


125

Обновление :

Начиная с Visual Studio 2015 с обновлением 1, в графическом интерфейсе пользователя есть простой процесс для выполнения описанных ниже действий за вас. Просто щелкните свой веб-проект правой кнопкой мыши и выберите «Включить C # 6 / VB 14». Дополнительная информация доступна в сообщении блога MSDN « Новая функция для включения C # 6 / VB 14 ».

Поскольку этот ответ был написан, эта функция была добавлена ​​с помощью пакета NuGet.

Добавьте этот пакет Nuget в свое решение, если вы используете MVC5.

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

Пакет nuget должен изменить ваш web.config, но убедитесь, что в вашем файле web.config есть следующая конфигурация (и если она не добавлена):

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

В MVC6 это встроено.


Оригинальный ответ:

<div>
    @($"Hello {this.Model.SomeProperty}")
</div>

Это работает только в C # 6 с MVC6. Даже если вы запускаете MVC5 с компилятором C # 6, это не сработает.

Хитрость в том, что синтаксический анализатор бритвы еще не достаточно умен, чтобы распознавать некоторые синтаксисы, поэтому вы должны заключить все это в круглые скобки (вы должны сделать это и при использовании условного оператора null ( ?.) в ваших представлениях бритвы).

При этом, строка интерполяции в Razor является немного глючит на данный момент в MVC6, так что я не удивлюсь , если там были некоторые проблемы с ним. будут ли они рассмотрены или нет - другой вопрос.


Ах, бинго, я использовал MVC 5. Спасибо!
Тим Шмидт,

5
MVC 5.2.3 действительно работает, вам просто нужно добавить пакет dom кода rosyln для asp.net. См. Этот ответ в
открытом

1
кстати, vs обновил ошибку, и теперь я говорю, что С # 6 не поддерживается, что лучше
CMS

2
Даже после установки этого пакета NuGet, который также обновлял Web.Config, я все еще получаю следующее сообщение об ошибке в виде подсказки: «Функция« Оператор распространения нулевого значения »недоступна в C # 5. Используйте версию языка 6 или выше».
Super Coder

1
У меня не было опции «Включить C # 6 / VB 14» в контекстном меню. Но у меня он был в Visual Studio, в меню «Проект», поэтому я включил его оттуда. Спасибо.
HasanG

14
  1. Выполните следующую команду в консоли диспетчера пакетов, чтобы добавить в проект необходимого CodeDomпоставщика. Он web.configавтоматически изменит ваш файл, чтобы добавить в него CodeDomнеобходимые настройки.

    Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

  2. Начать сначала Visual Studio

Примечание.Как сказал @Jake в своем комментарии под этим ответом, если у вас уже есть DotNetCompilerPlatformпакет, его, возможно, просто нужно обновить.


Это правильное решение сегодня. Из описания Microsoft: Replacement CodeDOM providers that use the new .NET Compiler Platform ("Roslyn") compiler as a service APIs. This provides support for new language features in systems using CodeDOM (e.g. ASP.NET runtime compilation) as well as improving the compilation performance of these systems.
Луис Феррао,

1
Для моего сценария у меня уже был этот пакет, но это была версия 1.0.5. Обновление до 1.0.8 решило проблему.
Джейк

Мне не нужно было перезапускать Visual Studio.
Джонатан Барклай

@JohnathanBarclay перезапуск был необходим в моем случае. Думаю, можно с уверенностью предположить, что некоторым это будет необходимо.
Loudenvier
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.