2017-03-16 20 views
11

Tôi đã tìm các câu hỏi khác liên quan đến điều này, nhưng dường như không có gì là tôi đang tìm kiếm.Sử dụng tính năng C# 7 bên trong Chế độ xem trong dự án ASP.NET MVC Core

Tôi có một trang web đang chạy trên ASP.NET Core với cấu trúc dự án mới trong VS2017. Các tệp mã sử dụng tính năng C# 7 biên dịch tốt. Nhưng cố gắng sử dụng các tính năng đó trong Chế độ xem sẽ dẫn đến một loạt lỗi về cú pháp. Tôi đã thử cài đặt Roslyn để làm cho nó được sử dụng khi biên dịch các khung nhìn từ những gì tôi có thể nói với các tính năng C# 7 có sẵn trong gói nen Roslyn 2.x và cao hơn. Nhưng bây giờ tôi nhận được phản hồi rõ ràng nói rằng

lỗi CS8059: Tính năng 'khai báo biến' không có sẵn trong C# 6. Vui lòng sử dụng phiên bản ngôn ngữ 7 trở lên.

Trong quá khứ tôi sẽ kiểm tra web.config, nhưng không có web.config trong dự án ASP.NET Core khác với dự án gần trống ở gốc để xử lý yêu cầu tắt từ IIS.

Làm cách nào để cho biết rằng Chế độ xem của tôi sẽ được biên dịch với Roslyn vì không được thực hiện cho đến khi chạy? Ít nhất tôi giả định rằng sẽ khắc phục vấn đề của tôi vào thời điểm này.

Chỉnh sửa: Câu hỏi đó không trùng lặp điều này, như tôi đã đề cập lúc đầu, tôi cũng đã tìm câu hỏi hiện có. Điều đó đặc biệt cho phép các tính năng C# 7 trong ứng dụng của bạn tại thời gian biên dịch và chỉ cho một ứng dụng ASP.NET. Tôi đang sử dụng ASP.NET Core, mà không có một web.config với bất kỳ thiết lập biên dịch được định nghĩa trong nó. Ngoài ra, những gì tôi đang cố gắng để làm điều đó cho các lần xem được biên dịch trong thời gian chạy và có thể được trên một hệ thống khác nhau.

Giải pháp:

Đối với bất cứ ai quan tâm, Bạn cần phải thêm Roslyn để dự án của bạn (mà tôi biết), nhưng bạn cũng phải cấu hình RazorViewEngineOptions sử dụng mà chỉ ra các phiên bản ngôn ngữ (mặc định là 6). Tôi đã làm điều này nhưng tôi đã không làm điều đó một cách chính xác. Tôi cần phải chỉ định kết quả của WithLanguageVersion() mặt sau của ParseOptions để thay thế chúng.

services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7)); 
+1

có thể trùng lặp của [Kích hoạt C# 7 trong một ứng dụng asp.net] (http://stackoverflow.com/ câu hỏi/42744689/cho phép-c-sharp-7-trong-a-asp-net-ứng dụng) – uTeisT

+0

Không phải là một bản sao, thêm chi tiết tại sao. –

+0

Thông báo lỗi bạn nhận được cho biết trình biên dịch đã được nâng cấp đúng cách (cú pháp mới đã được nhận dạng). Phải có một cài đặt/langversion ở đâu đó điều khiển điều này trong ASP.Net Core, nhưng tôi không biết nó ở đâu. Lấy làm tiếc. –

Trả lời

14

Bạn có thể thử như sau (khuyến cáo của folks trên các nhóm nòng cốt ASP.NET):

  1. Cài đặt Microsoft.CodeAnalysis.CSharp (phiên bản 2.0.0) và System.ValueTuple (phiên bản 4.3.0) gói
  2. Khi khởi động.cs, trong phương pháp ConfigureServices, cấu hình Razor sử dụng C# 7 bằng cách làm như sau:

    services.AddMvc().AddRazorOptions(options => 
        options.ParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7)); 
    
+0

Tôi đã có tất cả những điều đó, nhưng tôi đã thử nó một lần nữa để kiểm tra lại để chắc chắn, và bạn đã làm việc. Sau khi tìm kiếm sự khác biệt, tôi phát hiện ra rằng nhiệm vụ của bạn cho các tác phẩm 'ParseOptions' nhưng lời gọi của tôi tới' ParseOptions.WithLanguageVersion() 'thì không. Vì vậy, tôi đã đi tìm kiếm việc thực hiện (Tôi yêu rằng đây là tất cả nguồn mở). Hóa ra 'WithLanguageVersion()' không thay đổi 'ParseOptions' hiện tại của bạn, mà thay vào đó trả về một' CSharpParseOptions' mới. Vì vậy, một khi tôi đã gán nó trở lại thuộc tính 'ParseOptions', nó hoạt động tốt. Một ít truy cập trực quan, nhưng nó hoạt động. :-) –

+0

Cảm ơn một loạt sự giúp đỡ !! :-) –

+0

Điều này có hoạt động với các bộ tên được đặt tên không? Tôi đang trong ấn tượng nó sẽ không, chắc chắn từ các bài kiểm tra tôi đã chạy nó có vẻ là trường hợp như nó ném một 'RuntimeBinderException'. –

1

Vì vậy, tôi phát hiện ra rằng có một số tùy chọn biên dịch được hiển thị mà bạn gọi trong cuộc gọi ConfigureServices().

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc().AddRazorOptions(x => x.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7)); 
} 

Sự cố là LanguageVersion.CSharp7 có lỗi nếu bạn không thêm Roslyn. Vì vậy, tôi giả định đó là cần thiết.

Sau khi thêm Roslyn, mọi thứ biên dịch tốt, NHƯNG chế độ xem vẫn đưa ra lỗi.

@{ 
    //My view code 
    string s = "1"; 
    int.TryParse(s, out int i); 
} 

Vì vậy, nếu MVC hiển thị RazorOptions bạn có thể sử dụng để chỉ định phiên bản ngôn ngữ, tại sao nó không được tôn trọng?

+0

Bạn cần phải sử dụng 'services.AddMvc() AddRazorOptions (x => x.ParseOptions = x.ParseOptions.WithLanguageVersion (LanguageVersion.CSharp7));.' bởi vì bạn đang làm việc với các roslyn bất biến ở đây :) – Suchiman

Các vấn đề liên quan