2013-03-21 31 views
14

Gần đây tôi đã nâng cấp trang web của mình từ ASP.NET MVC3 (Razor) lên MVC4 (Razor2), và thực hiện điều này công cụ xem Dao cạo.Có thể thay đổi đột ngột trong MVC4 Dao cạo có thể được sửa bằng "@: @"

Kịch bản (được đơn giản hóa rất nhiều) được hiển thị bên dưới.

@model IEnumerable<string> 

@{ Layout = null; } 

<!DOCTYPE html> 

<html> 
    <body> 
     <div> 
       @foreach (var x in Model) 
       { 
        @string.Format("Foo bar: {0}", x) // Errors in MVC4/Razor2 
       } 
     </div> 
    </body> 
</html> 

này hoạt động tốt trong MVC3/Razor, tuy nhiên trong MVC4/Razor2 các string.Format kết quả dòng trong một lỗi của:

bất ngờ "chuỗi" từ khóa sau nhân vật "@". Một khi bên trong mã, bạn không cần phải tiền tố xây dựng như "chuỗi" với "@".

Nếu bạn xóa @, thì công cụ xem sau đó yêu cầu bạn chấm dứt dòng string.Format bằng dấu chấm phẩy. Tuy nhiên, ReSharper sau đó cảnh báo (đúng như vậy):

Giá trị trả về của phương pháp thuần túy không được sử dụng.

Hai bản vá Tôi đã tìm thấy cho điều này là một trong hai để sử dụng <text>:

<text>@string.Format("The value {0}", x)</text> 

Hoặc một cách tiếp cận tò mò hơn khi sử dụng @:@:

@:@string.Format("The value {0}", x) 

Đây có phải là một sự thay đổi được biết đến và ghi nhận trong công cụ xem Razor?

+1

Cảnh báo từ resharper trong trường hợp này là không chính xác, và phải được thông báo cho họ hay bị ức chế. Có sự khác biệt giữa mã C# được tạo tại thời điểm thiết kế và trong thời gian chạy, thời gian chạy C# sẽ quấn chuỗi.format với một cuộc gọi phương thức khác, và do đó nó hoàn toàn hợp lệ. Resharper nên bỏ qua lớp lỗi này (và bạn có thể) –

Trả lời

15

Có vẻ như một lỗi. Nó hoạt động với String:

@foreach (var x in Model) 
{ 
    @String.Format("Foo bar: {0}", x) 
} 
+1

Rất có thể vì 'String' không phải là một từ khóa. Tuy nhiên, một hành vi hơi kỳ lạ, tôi không chắc tại sao nó lại cho phép '@' chặn mã bên trong để bắt đầu. –

+0

@ phải được cho phép vì nó hợp lệ C#; nó được sử dụng để khai báo các chuỗi nguyên văn; I E. các chuỗi trong đó các ký tự đặc biệt được sao chép chính xác. Vì vậy, 'string msg =" test \ t message ";' thay thế '\ t' bằng một tab, nhưng' string msg = @ "test \ t message"; 'để nó thành' "\ t" '. – anaximander

+0

@ không cần phải được cho phép và không có trong Razor. @ trước khi số nhận dạng được sử dụng để ghi đè các từ khóa có tên loại. –

5

Đây thực sự là một lỗi, chúng tôi quyết định không sửa chữa, lưu ý rằng cú pháp là không chính xác như không có chuyển tiếp giữa C# và đánh dấu trong trường hợp này.

Tôi hiểu rằng tính năng chia sẻ lại hiển thị cảnh báo ở đây nhưng tôi tin rằng cảnh báo là sai.

Đây là lỗi để tham khảo trong tương lai https://aspnetwebstack.codeplex.com/workitem/458

+0

Tính năng chia sẻ lại hiển thị cảnh báo nhưng thời gian chạy sẽ cảnh báo ngoại lệ .. – rfcdejong

+0

Tham chiếu khác: https://github.com/aspnet/Razor/issues/64 – GSerg

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