Nội suy chuỗi trong chế độ xem Razor?


93

Điều này có được hỗ trợ không?

Nếu vậy, có một số mẹo để kích hoạt nó không? Tôi giả sử Razor không sử dụng trình biên dịch mới đủ ...? VS2015 IDE có vẻ ổn với nó nhưng trong thời gian chạy, tôi nhận được

CS1056: Ký tự không mong muốn '$'


Bạn có thể hiển thị mã bạn đang nói đến không?
Jeroen Vannevel

Bạn đang sử dụng ASP.NET nào (ASP.NET 5: cái mới được xây dựng trên .NET Core; hoặc bản cập nhật cho ASP.NET 4)?
Richard

6
CHỦ ĐỀ CHÍNH THỨC NÀY NHƯ THẾ NÀO?!?!?! Nực cười.
Josh M.

1
Cảm ơn bạn! Tôi rất vui vì ai đó đã nói điều đó. Tôi nghĩ rằng nó khá hữu ích và cá nhân tôi biết 2 người có cùng một vấn đề với cùng một giải pháp. Ai chịu trách nhiệm ở đây vậy ??
Tim Schmidt

@TimSchmidt Hàng đợi đóng dài, vì vậy đôi khi các câu hỏi được đóng không đúng cách. Nhưng hàng đợi mở lại ngắn, vì vậy nếu thực sự nên mở lại, nó sẽ diễn ra khá nhanh chóng.
o11c

Câu trả lời:


124

Cập nhật :

Bắt đầu từ Visual Studio 2015 Update 1, có một quy trình đơn giản trong GUI để thực hiện các bước bên dưới cho bạn. Chỉ cần nhấp chuột phải vào dự án web của bạn và chọn "Bật C # 6 / VB 14". Thông tin thêm có sẵn trên bài đăng trên blog MSDN, " Tính năng mới để kích hoạt C # 6 / VB 14 ".

Kể từ khi câu trả lời này được viết, chức năng này đã được thêm vào với sự hỗ trợ của gói NuGet.

Thêm gói Nuget này vào giải pháp của bạn nếu bạn đang sử dụng MVC5.

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

Gói nuget sẽ sửa đổi web.config của bạn, nhưng hãy kiểm tra xem cấu hình sau có trong tệp web.config của bạn không (và nếu nó không được thêm vào):

  <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>

Trong MVC6, điều này được tích hợp sẵn.


Câu trả lời ban đầu:

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

Điều này chỉ hoạt động trong C # 6 với MVC6. Ngay cả khi bạn đang chạy MVC5 với trình biên dịch C # 6, nó sẽ không hoạt động.

Bí quyết là trình phân tích cú pháp dao cạo chưa đủ thông minh để nhận ra một số cú pháp, vì vậy bạn phải đặt toàn bộ trong dấu ngoặc đơn (bạn cũng phải làm điều này khi sử dụng toán tử điều kiện null ( ?.) trong các khung nhìn dao cạo của bạn).

Điều đó nói rằng, nội suy chuỗi trong Razor hiện có một chút lỗi trong MVC6, vì vậy tôi sẽ không ngạc nhiên nếu có một số vấn đề với nó. liệu chúng có được giải quyết hay không là một vấn đề khác.


Ah, bingo, tôi đã sử dụng MVC 5. Cảm ơn!
Tim Schmidt

5
MVC 5.2.3 hoạt động, bạn chỉ cần thêm gói dom mã rosyln cho asp.net. Xem câu trả lời này trong một câu hỏi không khép kín: stackoverflow.com/a/31548221/637783
jbtule

1
bằng cách vs cập nhật lỗi và bây giờ tôi nói rằng c # 6 không được hỗ trợ, mà là tốt hơn
CMS

1
Ngay cả sau khi cài đặt gói NuGet đã cập nhật Web.Config này, tôi vẫn nhận được thông báo lỗi sau dưới dạng mẹo công cụ: "Tính năng 'toán tử lan truyền null' không khả dụng trong C # 5. Vui lòng sử dụng ngôn ngữ phiên bản 6 trở lên."
Super Coder

1
Tôi không có tùy chọn "Bật C # 6 / VB 14" trên menu chuột phải. Nhưng tôi đã có nó trong Visual Studio, menu Project nên tôi đã kích hoạt nó từ đó. Cảm ơn.
HasanG

14
  1. Chạy lệnh sau trong Bảng điều khiển Trình quản lý Gói để thêm CodeDomnhà cung cấp bắt buộc vào dự án của bạn. Nó sẽ web.configtự động sửa đổi tệp của bạn để thêm CodeDomcác cài đặt cần thiết cho nó.

    Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

  2. Khởi động lại Visual Studio

Lưu ý: Như @Jake đã đề cập trong bình luận của anh ấy dưới câu trả lời này, nếu bạn đã có DotNetCompilerPlatformgói thì có thể chỉ cần cập nhật.


Đây là giải pháp chính xác ngày hôm nay. Từ mô tả của 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.
Luis Ferrao

1
Đối với kịch bản của tôi, tôi đã có gói này, nhưng nó là phiên bản 1.0.5. Cập nhật lên 1.0.8 đã giải quyết được sự cố.
Jake

Tôi không cần khởi động lại Visual Studio.
Johnathan Barclay,

@JohnathanBarclay việc khởi động lại là cần thiết trong trường hợp của tôi. Tôi nghĩ rằng thật an toàn khi cho rằng nó sẽ cần thiết cho một số người.
Loudenvier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.