Trộn mã dao cạo và mã Javascript


171

Tôi khá bối rối với cách trộn dao cạo và js. Đây là chức năng hiện tại tôi đang bị mắc kẹt:

<script type="text/javascript">

        var data = [];

        @foreach (var r in Model.rows)
        {
                data.push([ @r.UnixTime * 1000, @r.Value ]);
        }

Nếu tôi có thể khai báo mã c # với <c#></c#>và mọi thứ khác là mã JS - đây sẽ là những gì tôi đang theo sau:

<script type="text/javascript">

        var data = [];

        <c#>@foreach (var r in Model.rows) {</c#>
                data.push([ <c#>@r.UnixTime</c#> * 1000, <c#>@r.Value</c#> ]);
        <c#>}</c#>

Phương pháp tốt nhất để đạt được điều này là gì?


2
Rõ ràng cú pháp tô sáng cũng rất hay và nhầm lẫn với <c#>các thẻ của tôi :-P
Kyle Brandt

1
Bạn đã kiểm tra đầu ra HTML của chế độ xem này chưa? Nó trông như thế nào, và bạn muốn nó khác biệt như thế nào?
sukru

Đưa ra một lỗi về Conditional Compilation vì vậy tôi không thể thấy HTML - vì vậy tôi tin rằng nó cảm thấy một phần của mã này là mã C #.
Kyle Brandt

1
Có vẻ như là một lỗi JavaScript: webdeveloper.com/forum/showthread.php?t=99780 . Thông báo lỗi chính xác là gì và bạn nhận được thông báo ở đâu?
sukru

2
Tôi nghĩ rằng đây là một trường hợp cố gắng kết hợp chặt chẽ giữa JS và C # sẽ là một nỗi đau để đọc / duy trì. Tôi rất vui vì trình biên dịch không cho phép bạn sử dụng mã này. :)
Jim Bolla

Câu trả lời:


332

Sử dụng <text>:

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
      <text>
            data.push([ @r.UnixTime * 1000, @r.Value ]);
      </text>
   }
</script>

27
Dao cạo hoạt động tốt trong các khối Javascript khi được thực thi nhưng tôi ghét cách làm nổi bật cú pháp bị nhầm lẫn. Tôi tin rằng tất cả các mã Dao động là Cú pháp không hợp lệ vì tôi tin rằng nó bị kẹt trong chế độ Javascript.
Chev

2
Nếu mã này nằm trong một gói thì sao? Tôi có thể viết mã bên trong tệp javascript không ??
ncubica

2
Hoạt động hoàn hảo cho đến khi bạn muốn kiểm tra xem một biến có nhỏ hơn biến khác không và dao cạo sẽ biến mất!
cbp

1
@ncubica nếu bạn muốn dùng dao cạo trong bó, hơn là đôi khi sai trong khái niệm của bạn. Dao cạo là để xem, không phải javascript.
100r

1
@ncubica Bài đăng này đã cũ, nhưng giải pháp cho câu hỏi của bạn là: Viết hàm trong tệp JS, kết xuất nó với Scripts.Render, sau đó gọi hàm trong <script>thẻ. Không chính xác duyên dáng, nhưng nó hoạt động cho hầu hết các trường hợp sử dụng (đọc: đơn giản).
Sinjai

81

Bên trong một khối mã (ví dụ @foreach:), bạn cần đánh dấu đánh dấu (hoặc, trong trường hợp này là Javascript) bằng @:hoặc <text>thẻ .

Bên trong bối cảnh đánh dấu, bạn cần bao quanh mã với các khối mã ( @{ ... }hoặc @if, ...)


Tại sao bạn nói "đánh dấu đánh dấu", điều này sẽ không thành vấn đề nếu trên thực tế, nội dung là đánh dấu.
Max Toro

1
@Max: Mặc dù nó không giống như đánh dấu, nhưng nó là đánh dấu. (Trái ngược với mã phía máy chủ)
SLaks

@:là những gì tôi đang tìm kiếm, tuyệt vời!
Muflix

53

bạn cũng có thể đơn giản sử dụng

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
       @:data.push([ @r.UnixTime * 1000, @r.Value ]);
   }
</script>

lưu ý @:


12

Không bao giờ trộn lẫn nhiều ngôn ngữ.

<script type="text/javascript">
    var data = @Json.Encode(Model); // !!!! export data !!!!

    for(var prop in data){
      console.log( prop + " "+ data[prop]);
    }

Trong trường hợp có vấn đề, bạn cũng có thể thử

@Html.Raw(Json.Encode(Model));

Điều này thật tuyệt, nhưng cũng có những trường hợp hợp pháp mà chúng ta cần kết hợp. Nhưng đây là giải pháp tôi đã sử dụng vì nó phù hợp hoàn hảo.
sương giá

3
Lưu ý rằng đây ngôn ngữ trộn. Bạn có một câu lệnh là nửa JavaScript ("var data =") và nửa Dao cạo / C # ("@ Json.Encode (Model)"). Nó chỉ là một sự pha trộn ít xâm lấn hơn, nhưng nó cũng không kém phần pha trộn so với việc có một "foreach" dao cạo / C # mà cơ thể của nó phát ra JavaScript được tạo. :-)
Jonathan Gilbert

3
Nó trở lại Uncaught SyntaxError: Unexpected token &bởi vì mô hình trở thành một cái gì đó như thế này[{&quot;Id&quot;:1,&quot;Name&quot;:&quot;Name}]
Weihui Guo

1

Một phương pháp không thông thường để tách javascript khỏi chế độ xem, nhưng vẫn sử dụng dao cạo trong đó là tạo một Scripts.cshtmltệp và đặt javascript / dao cạo hỗn hợp của bạn ở đó.

Index.cshtml

<div id="Result">
</div>

<button id="btnLoad">Click me</button>

@section scripts
{
    @Html.Partial("Scripts")
}

Sc Script.cshtml

<script type="text/javascript">
    var url = "@Url.Action("Index", "Home")";

    $(document).ready(function() {
        $("#btnLoad").click(function() {
            $.ajax({
                type: "POST",
                url: url ,
                data: {someParameter: "some value"},
                contentType: "application/json; charset=utf-8",
                dataType: "json",

                success: function(msg) {
                    $("#Result").text(msg.d);
                }
            });
        });
    });
</script>


-1

Gói mã Dao cạo của bạn trong @ {} khi bên trong tập lệnh JS và lưu ý sử dụng chỉ @ Đôi khi nó không hoạt động:

function hideSurveyReminder() {
       @Session["_isSurveyPassed"] = true;
    }

Điều này sẽ tạo ra

function hideSurveyReminder() {
       False = true;
    }

trong trình duyệt = (

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.