Hướng dẫn javascript in razor pages - javascript trong các trang dao cạo

Làm thế nào tôi có thể gọi một phương thức JavaScript từ chế độ xem dao cạo?

Show

Nội dung chính ShowShow

  • Gọi các chức năng JavaScript từ các phương thức .NET trong blazor Core ASP.NET
  • Trong bài viết này
  • API JavaScript giới hạn trong cử chỉ người dùng
  • Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Kịch bản tạo nội dung động
  • Prerendering
  • Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
  • Vị trí của JavaScript
  • Sự cô lập JavaScript trong các mô -đun JavaScript
  • Nắm bắt các tài liệu tham khảo về các yếu tố
  • Các yếu tố tham chiếu trên các thành phần
  • Harden javascript interop cuộc gọi
  • Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.
  • Phương thức .NET gọi.
  • Hỗ trợ mảng byte
  • Giới hạn kích thước trên các cuộc gọi interop JavaScript
  • Phát trực tuyến từ .NET đến JavaScript
  • Bắt các ngoại lệ JavaScript
  • Hủy bỏ một chức năng JavaScript chạy dài
  • JavaScript ________ 388/________ 389 Interop
  • JavaScript interop
  • JavaScript interop
  • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core: Phần interop JavaScript thảo luận về việc xử lý lỗi trong các kịch bản interop JS.
  • API JavaScript giới hạn trong cử chỉ người dùng
  • Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Kịch bản tạo nội dung động
  • Prerendering
  • Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
  • Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
  • Vị trí của JavaScript
  • Nắm bắt các tài liệu tham khảo về các yếu tố
  • Các yếu tố tham chiếu trên các thành phần
  • Harden javascript interop cuộc gọi
  • Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.
  • Phương thức .NET gọi.
  • Hỗ trợ mảng byte
  • Giới hạn kích thước trên các cuộc gọi interop JavaScript
  • JavaScript interop
  • Chức năng có khả năng được đổi tên.
  • Trong mã C#:
  • [script.js] function buttonClick() { // this function triggers on button click } 64 là một trường hợp ijsruntime được tiêm.
  • Lớp JS [script.js] function buttonClick() { // this function triggers on button click } 70 sau đây chứa một chức năng chạy dài mô phỏng, [script.js] function buttonClick() { // this function triggers on button click } 71, để đếm liên tục cho đến khi [script.js] function buttonClick() { // this function triggers on button click } 72 chỉ ra rằng [script.js] function buttonClick() { // this function triggers on button click } 73 đã được gọi. Hàm [script.js] function buttonClick() { // this function triggers on button click } 74 là nhằm mục đích trình diễn để mô phỏng việc thực hiện chậm chức năng chạy dài và sẽ không có trong mã sản xuất. Khi một thành phần gọi [script.js] function buttonClick() { // this function triggers on button click } 75, [script.js] function buttonClick() { // this function triggers on button click } 71 được báo hiệu hủy bỏ thông qua kiểm tra có điều kiện vòng lặp [script.js] function buttonClick() { // this function triggers on button click } 77 trên [script.js] function buttonClick() { // this function triggers on button click } 78.
  • Tài nguyên bổ sung
  • API JavaScript giới hạn trong cử chỉ người dùng
  • Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Kịch bản tạo nội dung động
  • Prerendering
  • Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.
  • Vị trí của JavaScript
  • Sự cô lập JavaScript trong các mô -đun JavaScript
  • Các yếu tố tham chiếu trên các thành phần
  • Harden javascript interop cuộc gọi
  • Tránh các tài liệu tham khảo đối tượng tròn
  • Thư viện JavaScript hiển thị UI
  • Giới hạn kích thước trên các cuộc gọi interop JavaScript
  • JavaScript interop
  • Chức năng có khả năng được đổi tên.
  • Trong mã C#:
  • Tài nguyên bổ sung
  • API JavaScript giới hạn trong cử chỉ người dùng
  • Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)
  • Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)
  • Kịch bản tạo nội dung động
  • Prerendering
  • Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
  • Vị trí của JavaScript
  • Nắm bắt các tài liệu tham khảo về các yếu tố
  • Hàm JS [script.js] function buttonClick() { // this function triggers on button click } 09 tạo ra một sự kiện @if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 97 trên phần tử HTML được thông qua ([script.js] function buttonClick() { // this function triggers on button click } 11):
  • Harden javascript interop cuộc gọi
  • Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.
  • Phương thức .NET gọi.
  • Bắt các ngoại lệ JavaScript
  • JavaScript interop gọi không có mạch
  • Tài nguyên bổ sung
  • Nhận xét
  • Tôi có thể sử dụng JavaScript trong các trang dao cạo không?
  • Tôi có thể sử dụng JavaScript trong Blazor không?
  • Làm thế nào để bạn gọi một tệp javascript trong blazor?
  • Làm thế nào để bạn gọi một chức năng trong trang Dao cạo?

Lúc đầu tôi đã thử

@if (TempData["myMessage"] != null)
{ 
    @:displayMessage();
}

Và khi trang được hiển thị, tôi thực sự đã thấy "@: DisplayMessage (); trên trang HTML của tôi.

Vì vậy, sau đó tôi đã thử.

@if (TempData["myMessage"] != null)
{ 
    
}

Hoạt động nếu chức năng DisplayMessage tồn tại trên trang HTML đó. Tuy nhiên, trong trường hợp của tôi DisplayMessage tồn tại trong một tệp JavaScript riêng biệt. (Được bao gồm trên trang web này)

Hỏi ngày 11 tháng 11 năm 2015 lúc 14:15Nov 11, 2015 at 14:15Nov 11, 2015 at 14:15

Hướng dẫn javascript in razor pages - javascript trong các trang dao cạo

1

JavaScript mà bạn đang cố gắng gọi sẽ được gọi khi phần này của trang bạn hiển thị được hiển thị. Hàm

@if (TempData["myMessage"] != null)
{ 
    
}
04 của bạn có thể được tải hoặc không được tải vào thời điểm đó, tùy thuộc vào việc bạn đang tải nó từ một tệp JS riêng biệt, liệu nguồn tập lệnh có tham chiếu nó ở bên dưới thẻ tập lệnh hiện tại mà bạn đang cố gắng gọi nó từ, v.v. Có thể trì hoãn cuộc gọi cho đến khi cửa sổ được tải như thế này:
@if (TempData["myMessage"] != null)
{ 
    
}

Đã trả lời ngày 11 tháng 11 năm 2015 lúc 14:18Nov 11, 2015 at 14:18Nov 11, 2015 at 14:18

Konstantin Dinevkonstantin DinevKonstantin DinevKonstantin Dinev

33.5K14 Huy hiệu vàng72 Huy hiệu bạc98 Huy hiệu đồng14 gold badges72 silver badges98 bronze badges14 gold badges72 silver badges98 bronze badges

2

Bạn có thể gọi các phương thức JavaScript từ các trang Blazor với sự trợ giúp của JavaScript interop bằng cách đưa ijsruntime phụ thuộc vào trang dao cạo.JavaScript Interop by injecting the dependency IJSRuntime into the razor page.JavaScript Interop by injecting the dependency IJSRuntime into the razor page.

[script.js]
function buttonClick() {
    // this function triggers on button click
}

Sau đó giới thiệu tập lệnh trong trang HTML của ứng dụng Blazor.

[index.razor]
@page "/"
@inject IJSRuntime jsRuntime



@code {
    protected void onbuttonclick (MouseEventArgs args)
    {
        await jsRuntime.InvokeVoidAsync("buttonClick ");
    }
}

Kiểm tra liên kết này để biết thêm thông tin.

Bỏ qua nội dung chính

Trình duyệt này không còn được hỗ trợ.

Nâng cấp lên Microsoft Edge để tận dụng các tính năng mới nhất, cập nhật bảo mật và hỗ trợ kỹ thuật.

Gọi các chức năng JavaScript từ các phương thức .NET trong blazor Core ASP.NET

  • Bài báo
  • 11/08/2022
  • 117 phút để đọc

Trong bài viết này

Bài viết này giải thích cách gọi các chức năng JavaScript (JS) từ .NET.

Để biết thông tin về cách gọi các phương thức .NET từ JS, hãy xem các phương thức gọi .NET từ các hàm JavaScript trong blazor ASP.NET Core.

IJSruntime được đăng ký bởi khung Blazor. Để gọi vào JS từ .NET, tiêm Trừu tượng IJSruntime và gọi một trong các phương pháp sau:

  • IJSRuntime.InvokeAsync
  • JSRuntimeExtensions.InvokeAsync
  • JSRuntimeExtensions.InvokeVoidAsync

Đối với các phương thức .NET trước đó gọi các hàm JS:

  • Mã định danh hàm (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    05) liên quan đến phạm vi toàn cầu (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    06). Để gọi
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    07, định danh là
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    08. Không cần phải đăng ký chức năng trước khi nó được gọi.
  • Chuyển bất kỳ số lượng đối số JSON-serializable trong
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    09 cho hàm JS.
  • Mã thông báo hủy bỏ (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    10) truyền một thông báo rằng các hoạt động nên bị hủy.
  • @if (TempData["myMessage"] != null)
    { 
        
    }
    
    11 thể hiện giới hạn thời gian cho hoạt động JS.
  • Loại trả lại
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    12 cũng phải có thể nối tiếp JSON.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    12 nên khớp với loại .NET bản đồ tốt nhất với loại JSON được trả về.
  • Một JS
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    14 được trả về cho các phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    15.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    15 mở ra
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    14 và trả về giá trị được chờ đợi bởi
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    14.

Đối với các ứng dụng Blazor có kích hoạt PRERENDERING, việc gọi vào JS là không thể thực hiện được. Để biết thêm thông tin, xem phần PRERENDERING.

Ví dụ sau đây dựa trên

@if (TempData["myMessage"] != null)
{ 
    
}
19, bộ giải mã dựa trên JS. Ví dụ cho thấy cách gọi hàm JS từ phương thức C# nhằm giảm tải yêu cầu từ mã nhà phát triển đến API JS hiện có. Hàm JS chấp nhận mảng byte từ phương thức C#, giải mã mảng và trả lại văn bản cho thành phần để hiển thị.
@if (TempData["myMessage"] != null)
{ 
    
}
2

Thành phần

@if (TempData["myMessage"] != null)
{ 
    
}
20 sau:
  • Gọi hàm
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    21 JS với InvokeAnync khi chọn nút (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    22).
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    22).
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    22
    ).
  • Sau khi hàm JS được gọi, mảng truyền được chuyển đổi thành một chuỗi. Chuỗi được trả về thành phần để hiển thị (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    23).
@if (TempData["myMessage"] != null)
{ 
    
}
24:
@if (TempData["myMessage"] != null)
{ 
    
}
9

API JavaScript giới hạn trong cử chỉ người dùng

Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.

Một số API JavaScript (JS) của Trình duyệt chỉ có thể được thực thi trong bối cảnh cử chỉ người dùng, chẳng hạn như sử dụng

@if (TempData["myMessage"] != null)
{ 
    
}
25 (tài liệu MDN). Các API này không thể được gọi thông qua cơ chế Interop JS trong các ứng dụng máy chủ Blazor vì xử lý sự kiện UI được thực hiện không đồng bộ và thường không còn trong bối cảnh cử chỉ của người dùng. Ứng dụng phải xử lý hoàn toàn sự kiện giao diện người dùng trong JavaScript, vì vậy hãy sử dụng
@if (TempData["myMessage"] != null)
{ 
    
}
26 thay vì thuộc tính chỉ thị
@if (TempData["myMessage"] != null)
{ 
    
}
27 của Blazor.

Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

Sử dụng invokeVoidasync khi:

  • .NET không bắt buộc phải đọc kết quả của cuộc gọi JavaScript (JS).
  • Các hàm JS trả về void (0)/void 0 hoặc không xác định.

Cung cấp chức năng

@if (TempData["myMessage"] != null)
{ 
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
@if (TempData["myMessage"] != null)
{ 
    
}
4

Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
33 trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
34 sau đây.
@if (TempData["myMessage"] != null)
{ 
    
}
35:
@if (TempData["myMessage"] != null)
{ 
    
}
9

Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

@if (TempData["myMessage"] != null)
{ 
    
}
38:
@if (TempData["myMessage"] != null)
{ 
    
}
0
@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
33 trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
41 sau đây.
@if (TempData["myMessage"] != null)
{ 
    
}
42:
@if (TempData["myMessage"] != null)
{ 
    
}
1

Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JavaScript (JS).

Cung cấp chức năng

@if (TempData["myMessage"] != null)
{ 
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
@if (TempData["myMessage"] != null)
{ 
    
}
4

Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
33 trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
34 sau đây.
@if (TempData["myMessage"] != null)
{ 
    
}
35:
@if (TempData["myMessage"] != null)
{ 
    
}
9

Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

@if (TempData["myMessage"] != null)
{ 
    
}
38:
@if (TempData["myMessage"] != null)
{ 
    
}
0
@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
33 trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
41 sau đây.
@if (TempData["myMessage"] != null)
{ 
    
}
42:
@if (TempData["myMessage"] != null)
{ 
    
}
1

Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JavaScript (JS).

@if (TempData["myMessage"] != null)
{ 
    
}
58:
@if (TempData["myMessage"] != null)
{ 
    
}
6

@if (TempData["myMessage"] != null) { } 44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:@if (TempData["myMessage"] != null) { } 2

Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
49 sau.
@if (TempData["myMessage"] != null)
{ 
    
}
50:
@if (TempData["myMessage"] != null)
{ 
    
}
3

Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

@if (TempData["myMessage"] != null)
{ 
    
}
53:
@if (TempData["myMessage"] != null)
{ 
    
}
4
@if (TempData["myMessage"] != null)
{ 
    
}
32 gọi phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if (TempData["myMessage"] != null)
{ 
    
}
56 sau.
@if (TempData["myMessage"] != null)
{ 
    
}
57:
@if (TempData["myMessage"] != null)
{ 
    
}
5

Kịch bản tạo nội dung động

Để tạo nội dung động với buildrendertree, hãy sử dụng thuộc tính Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

Prerendering

Phần này áp dụng cho Blazor Server và lưu trữ các ứng dụng WebAssugging của Blazor mà các thành phần của Preerender Razor. Prerendering được đề cập trong các thành phần dao cạo ASP.NET Core tích hợp.

Mặc dù một ứng dụng đang được bảo vệ, một số hành động nhất định, chẳng hạn như gọi vào JavaScript (JS), thì không thể.

Ví dụ sau, hàm

Example:

@if (TempData["myMessage"] != null)
{ 
    
}
9

Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

Ví dụ sau, hàm

@if (TempData["myMessage"] != null)
{ 
    
}
64 được đặt bên trong phần tử
@if (TempData["myMessage"] != null)
{ 
    
}
60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.
@if (TempData["myMessage"] != null)
{ 
    
}
0

Cảnh báo

Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

Sự kiện vòng đời

@if (TempData["myMessage"] != null)
{ 
    
}
61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
@if (TempData["myMessage"] != null)
{ 
    
}
61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
@if (TempData["myMessage"] != null)
{ 
    
}
66 được gọi để tìm lại thành phần với trạng thái mới thu được từ cuộc gọi interop JS (để biết thêm thông tin, xem kết xuất thành phần dao cạo ASP.NET Core). Mã không tạo ra một vòng lặp vô hạn vì
@if (TempData["myMessage"] != null)
{ 
    
}
66 chỉ được gọi khi
@if (TempData["myMessage"] != null)
{ 
    
}
68 là
@if (TempData["myMessage"] != null)
{ 
    
}
69.
@if (TempData["myMessage"] != null)
{ 
    
}
70:
@if (TempData["myMessage"] != null)
{ 
    
}
1

Ghi chú

Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

Example:

@if (TempData["myMessage"] != null)
{ 
    
}
2

Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor

Phần này chỉ áp dụng cho các ứng dụng Webassugging của Blazor.

Các cuộc gọi interop của JS không đồng bộ theo mặc định, bất kể mã được gọi là đồng bộ hay không đồng bộ. Các cuộc gọi không đồng bộ theo mặc định để đảm bảo rằng các thành phần tương thích trên cả hai mô hình lưu trữ blazor, máy chủ blazor và webassebly blazor. Trên máy chủ Blazor, tất cả các cuộc gọi interop của JS phải không đồng bộ vì chúng được gửi qua kết nối mạng.

Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:

@if (TempData["myMessage"] != null)
{ 
    
}
3

Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:

@if (TempData["myMessage"] != null)
{ 
    
}
4

Vị trí của JavaScript

Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):

  • Tải một tập lệnh trong đánh dấu
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60 (thường không được khuyến nghị)
  • Tải một tập lệnh trong đánh dấu
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    72
  • Tải tập lệnh từ tệp JavaScript bên ngoài (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    73) được hợp tác với một thành phần
  • Tải tập lệnh từ tệp JS bên ngoài (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    873)
  • Tiêm một tập lệnh sau khi blazor bắt đầu

Để biết thông tin về các tập lệnh cô lập trong các mô -đun JS, hãy xem phần cô lập JavaScript trong phần Mô -đun JavaScript.

Cảnh báo

Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

Sự kiện vòng đời

@if (TempData["myMessage"] != null) { } 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức @if (TempData["myMessage"] != null) { } 61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.@if (TempData["myMessage"] != null) { } 66 được gọi để tìm lại thành phần với trạng thái mới thu được từ cuộc gọi interop JS (để biết thêm thông tin, xem kết xuất thành phần dao cạo ASP.NET Core). Mã không tạo ra một vòng lặp vô hạn vì @if (TempData["myMessage"] != null) { } 66 chỉ được gọi khi @if (TempData["myMessage"] != null) { } 68 là @if (TempData["myMessage"] != null) { } 69.@if (TempData["myMessage"] != null) { } 70:@if (TempData["myMessage"] != null) { } 1

Ghi chú

Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

  • Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
  • Phần này chỉ áp dụng cho các ứng dụng Webassugging của Blazor.

Các cuộc gọi interop của JS không đồng bộ theo mặc định, bất kể mã được gọi là đồng bộ hay không đồng bộ. Các cuộc gọi không đồng bộ theo mặc định để đảm bảo rằng các thành phần tương thích trên cả hai mô hình lưu trữ blazor, máy chủ blazor và webassebly blazor. Trên máy chủ Blazor, tất cả các cuộc gọi interop của JS phải không đồng bộ vì chúng được gửi qua kết nối mạng.

@if (TempData["myMessage"] != null)
{ 
    
}
78:
@if (TempData["myMessage"] != null)
{ 
    
}
5

Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:

Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:

@if (TempData["myMessage"] != null)
{ 
    
}
80:
@if (TempData["myMessage"] != null)
{ 
    
}
6

Trong ví dụ trước:

  • Theo quy ước, định danh
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    81 là một định danh đặc biệt được sử dụng cụ thể để nhập mô -đun JS.
  • Chỉ định tệp JS bên ngoài của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    82, trong đó:
    • Đoạn đường dẫn cho thư mục hiện tại (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
    • Trình giữ chỗ
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      84 là đường dẫn và tên tệp theo
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      79.
  • Xóa bỏ IJSOBJECTREENTE cho bộ sưu tập rác trong IaSyncDisposable.DispoSeAnync.

Nhập tự động một mô -đun yêu cầu mạng, do đó chỉ có thể đạt được không đồng bộ bằng cách gọi invokeasync.

@if (TempData["myMessage"] != null)
{ 
    
}
86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

Ghi chú

Khi tệp JS bên ngoài được cung cấp bởi thư viện lớp Dao cạo, chỉ định tệp JS của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:

@if (TempData["myMessage"] != null)
{ 
    
}
87:
  • Đoạn đường dẫn cho thư mục hiện tại (
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
  • Trình giữ chỗ
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    79.
  • Xóa bỏ IJSOBJECTREENTE cho bộ sưu tập rác trong IaSyncDisposable.DispoSeAnync.
@if (TempData["myMessage"] != null)
{ 
    
}
7

Nhập tự động một mô -đun yêu cầu mạng, do đó chỉ có thể đạt được không đồng bộ bằng cách gọi invokeasync.

@if (TempData["myMessage"] != null) { } 86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

Ghi chú

Khi tệp JS bên ngoài được cung cấp bởi thư viện lớp Dao cạo, chỉ định tệp JS của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:

Trình giữ chỗ

@if (TempData["myMessage"] != null)
{ 
    
}
84 là đường dẫn và tên tệp theo
@if (TempData["myMessage"] != null)
{ 
    
}
79. Trong ví dụ sau, tệp JS bên ngoài (
@if (TempData["myMessage"] != null)
{ 
    
}
95) được đặt trong thư mục
@if (TempData["myMessage"] != null)
{ 
    
}
79 của thư viện lớp.

  • Để biết thêm thông tin, hãy xem tiêu thụ các thành phần dao cạo ASP.NET Core từ Thư viện lớp Dao cạo (RCL).
  • Nắm bắt các tài liệu tham khảo về các yếu tố

Một số kịch bản interop JavaScript (JS) yêu cầu tham chiếu đến các phần tử HTML. Ví dụ: thư viện UI có thể yêu cầu tham chiếu phần tử để khởi tạo hoặc bạn có thể cần gọi API giống như lệnh trên một phần tử, chẳng hạn như

@if (TempData["myMessage"] != null)
{ 
    
}
97 hoặc
@if (TempData["myMessage"] != null)
{ 
    
}
98.

Chụp tham chiếu đến các phần tử HTML trong một thành phần bằng cách sử dụng phương pháp sau:

Thêm thuộc tính

@if (TempData["myMessage"] != null)
{ 
    
}
99 vào phần tử HTML.

Xác định một trường thuộc loại loại có tên phù hợp với giá trị của thuộc tính

@if (TempData["myMessage"] != null)
{ 
    
}
99.

Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử

[script.js]
function buttonClick() {
    // this function triggers on button click
}
01
[script.js]
function buttonClick() {
    // this function triggers on button click
}
02:
@if (TempData["myMessage"] != null)
{ 
    
}
8

Cảnh báo

Chỉ sử dụng tham chiếu phần tử để biến đổi nội dung của một phần tử trống không tương tác với Blazor. Kịch bản này rất hữu ích khi API của bên thứ ba cung cấp nội dung cho phần tử. Bởi vì Blazor không tương tác với yếu tố, không có khả năng xung đột giữa đại diện của Blazor về phần tử và mô hình đối tượng tài liệu (DOM).

Trong ví dụ sau, thật nguy hiểm khi làm biến đổi nội dung của danh sách không có thứ tự (

[script.js]
function buttonClick() {
    // this function triggers on button click
}
03) vì Blazor tương tác với DOM để đưa ra các mục danh sách của yếu tố này (
[script.js]
function buttonClick() {
    // this function triggers on button click
}
04) từ đối tượng
[script.js]
function buttonClick() {
    // this function triggers on button click
}
05:
@if (TempData["myMessage"] != null)
{ 
    
}
9

Nếu JS interop làm biến đổi nội dung của phần tử

[script.js]
function buttonClick() {
    // this function triggers on button click
}
06 và Blazor sẽ cố gắng áp dụng các khác biệt cho phần tử, thì các diff sẽ không khớp với DOM.

Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

Một yếu tố được chuyển qua mã JS thông qua JS Interop. Mã JS nhận được một ví dụ

[script.js]
function buttonClick() {
    // this function triggers on button click
}
07, nó có thể sử dụng với API DOM bình thường. Ví dụ: mã sau đây xác định phương thức mở rộng .NET (
[script.js]
function buttonClick() {
    // this function triggers on button click
}
08) cho phép gửi chuột nhấp vào một phần tử.

[script.js]
function buttonClick() {
    // this function triggers on button click
}
2

Hàm JS

[script.js]
function buttonClick() {
    // this function triggers on button click
}
09 tạo ra một sự kiện
@if (TempData["myMessage"] != null)
{ 
    
}
97 trên phần tử HTML được thông qua (
[script.js]
function buttonClick() {
    // this function triggers on button click
}
11):
[script.js]
function buttonClick() {
    // this function triggers on button click
}
0

Để gọi hàm JS không trả về giá trị, hãy sử dụng jsruntimeExtensions.invokevoidasync. Mã sau đây kích hoạt sự kiện

[script.js]
function buttonClick() {
    // this function triggers on button click
}
4

@if (TempData["myMessage"] != null)
{ 
    
}
97 phía máy khách bằng cách gọi chức năng JS trước đó với phần tử bị bắt:
[script.js]
function buttonClick() {
    // this function triggers on button click
}
1

Để sử dụng phương thức mở rộng, hãy tạo một phương thức mở rộng tĩnh để nhận cá thể ijsruntime:

Phương thức

[script.js]
function buttonClick() {
    // this function triggers on button click
}
09 được gọi trực tiếp trên đối tượng. Ví dụ sau đây giả định rằng phương thức
[script.js]
function buttonClick() {
    // this function triggers on button click
}
08 có sẵn từ không gian tên
[script.js]
function buttonClick() {
    // this function triggers on button click
}
15:
[script.js]
function buttonClick() {
    // this function triggers on button click
}
3

  • Khi làm việc với các loại chung và trả về một giá trị, hãy sử dụng Valuetask:
  • Trình giữ chỗ

[script.js]
function buttonClick() {
    // this function triggers on button click
}
16 là định danh hàm JS.
[script.js]
function buttonClick() {
    // this function triggers on button click
}
17 được gọi trực tiếp trên đối tượng với một loại. Ví dụ sau đây giả định rằng
[script.js]
function buttonClick() {
    // this function triggers on button click
}
17 có sẵn từ không gian tên
[script.js]
function buttonClick() {
    // this function triggers on button click
}
15:
[script.js]
function buttonClick() {
    // this function triggers on button click
}
5

  • Các yếu tố tham chiếu trên các thành phần
  • Gọi các cuộc gọi lại đã đăng ký trong sự kiện OnAfterRender với tham chiếu phần tử được thông qua. Một cách gián tiếp, phương pháp này cho phép các thành phần con tương tác với tham chiếu phần tử của cha mẹ.
[script.js]
function buttonClick() {
    // this function triggers on button click
}
6
[script.js]
function buttonClick() {
    // this function triggers on button click
}
7
[script.js]
function buttonClick() {
    // this function triggers on button click
}
21 (Thành phần cha mẹ):
[script.js]
function buttonClick() {
    // this function triggers on button click
}
8
[script.js]
function buttonClick() {
    // this function triggers on button click
}
22:
[script.js]
function buttonClick() {
    // this function triggers on button click
}
9

Trong ví dụ trước, không gian tên của ứng dụng là

[script.js]
function buttonClick() {
    // this function triggers on button click
}
23 với các thành phần trong thư mục
[script.js]
function buttonClick() {
    // this function triggers on button click
}
24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
[script.js]
function buttonClick() {
    // this function triggers on button click
}
25 (Thành phần con):
0

Trong ví dụ trước, không gian tên của ứng dụng là

[script.js]
function buttonClick() {
    // this function triggers on button click
}
23 với các thành phần trong thư mục
[script.js]
function buttonClick() {
    // this function triggers on button click
}
24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
[script.js]
function buttonClick() {
    // this function triggers on button click
}
25 (Thành phần con):
0

[script.js] function buttonClick() { // this function triggers on button click } 23 với các thành phần được chia sẻ trong thư mục [script.js] function buttonClick() { // this function triggers on button click } 27. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.

Harden javascript interop cuộc gọi

Phần này chủ yếu áp dụng cho các ứng dụng Blazor Server, nhưng các ứng dụng Webassugging của Blazor cũng có thể đặt thời gian chờ JS Interop nếu điều kiện đảm bảo nó.

Trong các ứng dụng máy chủ Blazor, interop JavaScript (JS) có thể thất bại do lỗi kết nối mạng và nên được coi là không đáng tin cậy. Theo mặc định, các ứng dụng Blazor Server sử dụng thời gian chờ một phút cho các cuộc gọi interop của JS. Nếu một ứng dụng có thể chịu đựng được thời gian chờ tích cực hơn, hãy đặt thời gian chờ bằng một trong các phương pháp sau.

Đặt thời gian chờ toàn cầu trong

[script.js]
function buttonClick() {
    // this function triggers on button click
}
28 với CircuitOptions.jsInteropDefaultCallTimeout:
1

Người giữ chỗ

[script.js]
function buttonClick() {
    // this function triggers on button click
}
29 là một khoảng thời gian (ví dụ:
[script.js]
function buttonClick() {
    // this function triggers on button click
}
30).

2

Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

  • Trong ví dụ trước:
  • [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    29 là một khoảng thời gian (ví dụ:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    30).

Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

[script.js]
function buttonClick() {
    // this function triggers on button click
}
28 với CircuitOptions.jsInteropDefaultCallTimeout:
1

Người giữ chỗ

[script.js] function buttonClick() { // this function triggers on button click } 29 là một khoảng thời gian (ví dụ: [script.js] function buttonClick() { // this function triggers on button click } 30).

Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

  • Trong ví dụ trước:
  • Người giữ chỗ
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    29 là một khoảng thời gian (ví dụ:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    30).

[script.js] function buttonClick() { // this function triggers on button click } 33 là định danh cho hàm gọi. Ví dụ: giá trị @if (TempData["myMessage"] != null) { } 08 gọi hàm @if (TempData["myMessage"] != null) { } 07.

Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.

Để biết thêm thông tin về sự cạn kiệt tài nguyên, hãy xem Hướng dẫn giảm thiểu mối đe dọa cho máy chủ blazor ASP.NET Core.

Tránh các tài liệu tham khảo đối tượng tròn

3

Các đối tượng có chứa các tham chiếu tròn không thể được tuần tự hóa trên máy khách cho một trong hai:

Phương thức .NET gọi.

Các cuộc gọi phương thức JavaScript từ C# khi loại trả về có tham chiếu tròn.

Thư viện JavaScript hiển thị UI

Đôi khi bạn có thể muốn sử dụng các thư viện JavaScript (JS) tạo ra các phần tử giao diện người dùng có thể nhìn thấy trong mô hình đối tượng tài liệu trình duyệt (DOM). Thoạt nhìn, điều này có vẻ khó khăn vì hệ thống khác biệt của Blazor phụ thuộc vào việc kiểm soát cây của các phần tử DOM và gặp lỗi nếu một số mã bên ngoài làm biến đổi cây dom và vô hiệu hóa cơ chế của nó để áp dụng các khác biệt. Đây không phải là một giới hạn cụ thể của Blazor. Thử thách tương tự xảy ra với bất kỳ khung UI dựa trên khác nhau.

May mắn thay, thật đơn giản để nhúng UI được tạo ra bên ngoài trong một thành phần dao cạo UI một cách đáng tin cậy. Kỹ thuật được đề xuất là có mã thành phần (tệp

[script.js]
function buttonClick() {
    // this function triggers on button click
}
42:
4

@if (TempData["myMessage"] != null)
{ 
    
}
30) tạo ra một phần tử trống. Theo như hệ thống khác biệt của Blazor, phần tử luôn trống, vì vậy trình kết xuất không tái phát vào phần tử và thay vào đó để lại nội dung của nó một mình. Điều này làm cho nó an toàn để điền vào yếu tố với nội dung được quản lý bên ngoài tùy ý.

Ví dụ sau đây chứng minh khái niệm. Trong câu lệnh

[script.js]
function buttonClick() {
    // this function triggers on button click
}
37 khi
[script.js]
function buttonClick() {
    // this function triggers on button click
}
38 là
[script.js]
function buttonClick() {
    // this function triggers on button click
}
39, tương tác với
[script.js]
function buttonClick() {
    // this function triggers on button click
}
40 bên ngoài blazor sử dụng JS Interop. Ví dụ: gọi thư viện JS bên ngoài để điền vào phần tử. Blazor để lại nội dung của phần tử một mình cho đến khi thành phần này được loại bỏ. Khi thành phần bị loại bỏ, toàn bộ Subtree của DOM cũng bị xóa.

Hãy xem xét ví dụ sau đây hiển thị bản đồ tương tác bằng API MAPBox nguồn mở.

  • Thêm phần tử
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    43 sau vào đánh dấu phần tử
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60 (vị trí của nội dung
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60):
  • Ví dụ trước tạo ra UI bản đồ tương tác. Người dùng:

Trong ví dụ trước:

  • Người giữ chỗ
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    33 là định danh cho hàm gọi. Ví dụ: giá trị
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    08 gọi hàm
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    07.not safe for external JS code to modify elements that Blazor does not regard as empty.not safe for external JS code to modify elements that Blazor does not regard as empty.
  • Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.@key to preserve elements and components.@key to preserve elements and components.
  • Để biết thêm thông tin về sự cạn kiệt tài nguyên, hãy xem Hướng dẫn giảm thiểu mối đe dọa cho máy chủ blazor ASP.NET Core.

Hỗ trợ mảng byte

Blazor hỗ trợ interop mảng byte tối ưu hóa (JS) để tránh mã hóa/giải mã mảng byte vào base64. Ví dụ sau sử dụng JS Interop để chuyển một mảng byte cho JavaScript.

Cung cấp chức năng

[script.js]
function buttonClick() {
    // this function triggers on button click
}
53 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
7
[script.js]
function buttonClick() {
    // this function triggers on button click
}
54:
8

Để biết thông tin về việc sử dụng mảng byte khi gọi .NET từ JavaScript, hãy xem các phương thức CALL .NET từ các hàm JavaScript trong Blazor ASP.NET Core.

Giới hạn kích thước trên các cuộc gọi interop JavaScript

Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor. Trong Blazor Webassugging, khung không áp đặt giới hạn về kích thước của các đầu vào và đầu ra interop JavaScript (JS).

Trong máy chủ Blazor, các cuộc gọi interop JS bị giới hạn kích thước bằng kích thước tin nhắn tín hiệu đến tối đa được phép cho các phương thức trung tâm, được thực thi bởi HubOptions.MaximumReceIvemessagesize (mặc định: 32 kb). Các thông báo JS đến .NET Signalr lớn hơn MaximumReceIvemessagesize ném lỗi. Khung không áp đặt giới hạn về kích thước của tin nhắn SignalR từ trung tâm đến máy khách.

Khi ghi nhật ký tín hiệu không được đặt thành gỡ lỗi hoặc theo dõi, lỗi kích thước tin nhắn chỉ xuất hiện trong bảng điều khiển công cụ phát triển của trình duyệt:

Lỗi: Kết nối bị ngắt kết nối với lỗi 'Lỗi: Máy chủ đã trả về lỗi khi đóng: Kết nối đóng với lỗi.'.

Khi ghi nhật ký phía máy chủ Signalr được đặt thành gỡ lỗi hoặc theo dõi, việc ghi nhật ký phía máy chủ sẽ không hợp lệ cho lỗi kích thước tin nhắn.

[script.js]
function buttonClick() {
    // this function triggers on button click
}
55:
9

Error:

System.io.invaliddataException: Kích thước tin nhắn tối đa là 32768b đã bị vượt quá. Kích thước tin nhắn có thể được cấu hình trong AddHubOptions.

Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong

[script.js]
function buttonClick() {
    // this function triggers on button click
}
28. Ví dụ sau đây đặt kích thước tin nhắn nhận tối đa thành 64 kb:
[index.razor]
@page "/"
@inject IJSRuntime jsRuntime



@code {
    protected void onbuttonclick (MouseEventArgs args)
    {
        await jsRuntime.InvokeVoidAsync("buttonClick ");
    }
}0

Việc tăng giới hạn kích thước tin nhắn đến tín hiệu đến với chi phí yêu cầu nhiều tài nguyên máy chủ hơn và nó khiến máy chủ tăng rủi ro từ người dùng độc hại. Ngoài ra, việc đọc một lượng lớn nội dung trong bộ nhớ dưới dạng chuỗi hoặc mảng byte cũng có thể dẫn đến việc phân bổ hoạt động kém với bộ thu rác, dẫn đến các hình phạt hiệu suất bổ sung.

Hãy xem xét hướng dẫn sau khi phát triển mã chuyển một lượng lớn dữ liệu giữa JS và Blazor trong các ứng dụng máy chủ Blazor:

  • Tận dụng hỗ trợ interop phát trực tuyến gốc để truyền dữ liệu lớn hơn giới hạn kích thước tin nhắn Signalr đến:
    • Gọi các chức năng JavaScript từ các phương thức .NET trong blazor Core ASP.NET
    • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
  • Mẹo chung:
    • Đừng phân bổ các đối tượng lớn trong mã JS và C#.
    • Bộ nhớ tiêu thụ miễn phí khi quá trình được hoàn thành hoặc hủy bỏ.
    • Thực thi các yêu cầu bổ sung sau đây cho mục đích bảo mật:
      • Khai báo tệp tối đa hoặc kích thước dữ liệu có thể được truyền.
      • Khai báo tỷ lệ tải lên tối thiểu từ máy khách lên máy chủ.
    • Sau khi máy chủ nhận được dữ liệu, dữ liệu có thể là:
      • Tạm thời được lưu trữ trong bộ đệm bộ nhớ cho đến khi tất cả các phân đoạn được thu thập.
      • Tiêu thụ ngay lập tức. Ví dụ: dữ liệu có thể được lưu trữ ngay lập tức trong cơ sở dữ liệu hoặc được ghi vào đĩa khi nhận được mỗi phân đoạn.

Phát trực tuyến từ .NET đến JavaScript

Blazor hỗ trợ truyền phát dữ liệu trực tiếp từ .NET đến JavaScript. Các luồng được tạo bằng cách sử dụng dotNetStreamReference.

DotNetStreamReference đại diện cho luồng .NET và sử dụng các tham số sau:

  • [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    57: Luồng được gửi đến JavaScript.
  • [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    58: Xác định xem luồng còn mở sau khi truyền hay không. Nếu một giá trị không được cung cấp,
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    58 mặc định là
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    60.

Trong JavaScript, sử dụng bộ đệm mảng hoặc luồng có thể đọc được để nhận dữ liệu:

  • Sử dụng

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    61:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }1
  • Sử dụng

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    62:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }2

    Trong mã C#:

    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }3

    Trong ví dụ trước:

    • Trình giữ chỗ
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      63 đại diện cho luồng được gửi đến JavaScript.
    • [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      64 là một trường hợp ijsruntime được tiêm.

    CALL .NET Các phương thức từ các hàm JavaScript trong blazor ASP.NET Core bao gồm hoạt động ngược, phát trực tuyến từ JavaScript sang .NET.

    Tải xuống tệp blazor ASP.NET Core bao gồm cách tải xuống một tệp trong Blazor.

    Bắt các ngoại lệ JavaScript

    Để bắt các ngoại lệ của JS, hãy kết thúc khối JS trong khối ________ 365 -____ ____ 366 và bắt một JSException.

    Trong ví dụ sau, hàm

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    67 JS không tồn tại. Khi chức năng không được tìm thấy, JSException bị mắc kẹt với một thông báo cho biết lỗi sau:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    68
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    69:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }4

    Hủy bỏ một chức năng JavaScript chạy dài

    Sử dụng JS AbortControll với CancellationTokensource trong thành phần để hủy bỏ chức năng JavaScript dài từ mã C#.

    Lớp JS

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    70 sau đây chứa một chức năng chạy dài mô phỏng,
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    71, để đếm liên tục cho đến khi
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    72 chỉ ra rằng
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    73 đã được gọi. Hàm
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    74 là nhằm mục đích trình diễn để mô phỏng việc thực hiện chậm chức năng chạy dài và sẽ không có trong mã sản xuất. Khi một thành phần gọi
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    75,
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    71 được báo hiệu hủy bỏ thông qua kiểm tra có điều kiện vòng lặp
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    77 trên
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    78.
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }5

    Thành phần

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    79 sau:
    • Gọi hàm JS
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      71 khi nút
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      81 được chọn. Một CancellationTokensource được sử dụng để quản lý việc thực hiện chức năng chạy dài. CancellationToken.Register đặt một đại biểu cuộc gọi JS Interop để thực thi hàm JS
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      75 khi hủyStokensource.Token bị hủy.
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      81 button is selected. A CancellationTokenSource is used to manage the execution of the long-running function. CancellationToken.Register sets a JS interop call delegate to execute the JS function
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      75 when the CancellationTokenSource.Token is cancelled.
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      81
      button is selected. A CancellationTokenSource is used to manage the execution of the long-running function. CancellationToken.Register sets a JS interop call delegate to execute the JS function
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      75 when the CancellationTokenSource.Token is cancelled.
    • Khi nút
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      83 được chọn, CancellationTokensource.Token bị hủy với cuộc gọi để hủy.
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      83 button is selected, the CancellationTokenSource.Token is cancelled with a call to Cancel.
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      83
      button is selected, the CancellationTokenSource.Token is cancelled with a call to Cancel.
    • Việc hủy bỏ được xử lý theo phương pháp
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      84.
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    85:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }6

    Bảng điều khiển công cụ phát triển của trình duyệt cho biết việc thực hiện chức năng JS chạy dài sau khi nút

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    81 được chọn và khi chức năng bị hủy bỏ sau khi nút
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    83 được chọn:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    81 button is selected and when the function is aborted after the
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    83 button is selected:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }7
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    81
    button is selected and when the function is aborted after the
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    83
    button is selected:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }7

    JavaScript ________ 388/________ 389 Interop

    Phần này áp dụng cho các ứng dụng Webassugging của Blazor.

    Thay thế cho việc tương tác với JavaScript (JS) trong các ứng dụng Webassugging của Blazor sử dụng cơ chế Interop của Blazor dựa trên giao diện IJSruntime, A JS ________ 388/________ 389 API interop có sẵn cho các ứng dụng nhắm mục tiêu .NET 7 hoặc sau này.

    Để biết thêm thông tin, hãy xem JavaScript JSIMport/JSexport Interop với ASP.NET Core Blazor Webassembly.

    JavaScript interop

    Phần này áp dụng cho các ứng dụng Webassugging của Blazor.

    Thay thế cho việc tương tác với JavaScript (JS) trong các ứng dụng Webassugging của Blazor sử dụng cơ chế Interop của Blazor dựa trên giao diện IJSruntime, A JS ________ 388/________ 389 API interop có sẵn cho các ứng dụng nhắm mục tiêu .NET 7 hoặc sau này.

    Để biết thêm thông tin, hãy xem JavaScript JSIMport/JSexport Interop với ASP.NET Core Blazor Webassembly.

    JavaScript interop

    Interop chưa được đặt ra bằng cách sử dụng giao diện ijsunmarshalledruntime bị lỗi thời và nên được thay thế bằng JavaScript ________ 388/________ 389 Interop.

    JavaScript interop gọi không có mạch

    • Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.
      • IJSRuntime.InvokeAsync
      • JSRuntimeExtensions.InvokeAsync
      • JSRuntimeExtensions.InvokeVoidAsync)
    • Không thể phát hành các cuộc gọi interop JavaScript (JS) sau khi ngắt kết nối mạch tín hiệu. Nếu không có mạch trong quá trình xử lý thành phần hoặc bất cứ lúc nào đó không tồn tại mạch, phương thức sau đây sẽ không thành công và đăng nhập thông báo rằng mạch bị ngắt kết nối dưới dạng JSDisconnectedException:

    Các cuộc gọi phương thức interop của JS

    ________ 384/________ 395 kêu gọi bất kỳ ijsobjectreeference nào.

    • Để tránh ghi nhật ký jsdisconnectedException hoặc để đăng nhập thông tin tùy chỉnh, hãy nắm bắt ngoại lệ trong câu lệnh
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      96.
    • Đối với ví dụ xử lý thành phần sau:
    • Các thành phần thực hiện IAnyncDisposable.
    • [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      97 là một ijsobjectreeference.
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }8

    JSDisconnectedException bị bắt và không ghi lại.

    Tùy chọn, bạn có thể đăng nhập thông tin tùy chỉnh trong câu lệnh

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    66 ở bất kỳ cấp độ nhật ký nào bạn thích. Ví dụ sau đây không đăng nhập thông tin tùy chỉnh vì nó giả sử nhà phát triển không quan tâm đến việc khi hoặc nơi các mạch bị ngắt kết nối trong quá trình xử lý thành phần.
    • Nếu bạn phải dọn sạch các đối tượng JS của riêng mình hoặc thực thi mã JS khác trên máy khách sau khi mất mạch, hãy sử dụng mẫu
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      99 trong JS trên máy khách.
    • Để biết thêm thông tin, hãy xem các bài viết sau:

    Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core: Phần interop JavaScript thảo luận về việc xử lý lỗi trong các kịch bản interop JS.

    • Vòng đời thành phần dao cạo ASP.NET Core: Phần xử lý thành phần với phần
      00 và
      01 mô tả cách thực hiện các mẫu xử lý trong các thành phần dao cạo.
    • Tài nguyên bổ sungSwitch branches or tags dropdown list to select the branch.Switch branches or tags dropdown list to select the branch.
    • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
    • 02 Ví dụ (Kho lưu trữ GitHub của DOTNET/ASPNetCore
      03): Chi nhánh
      03 đại diện cho sự phát triển hiện tại của đơn vị sản phẩm cho bản phát hành tiếp theo của ASP.NET Core. Để chọn nhánh cho một bản phát hành khác (ví dụ:
      05), hãy sử dụng danh sách thả xuống nhánh hoặc thẻ chuyển đổi để chọn nhánh.

    Kho lưu trữ Github mẫu Blazor (

    06)

    Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core (phần interop JavaScript)

    • IJSRuntime.InvokeAsync
    • JSRuntimeExtensions.InvokeAsync
    • JSRuntimeExtensions.InvokeVoidAsync

    Đối với các phương thức .NET trước đó gọi các hàm JS:

    • Mã định danh hàm (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      05) liên quan đến phạm vi toàn cầu (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      06). Để gọi
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      07, định danh là
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      08. Không cần phải đăng ký chức năng trước khi nó được gọi.
    • Chuyển bất kỳ số lượng đối số JSON-serializable trong
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      09 cho hàm JS.
    • Mã thông báo hủy bỏ (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      10) truyền một thông báo rằng các hoạt động nên bị hủy.
    • @if (TempData["myMessage"] != null)
      { 
          
      }
      
      11 thể hiện giới hạn thời gian cho hoạt động JS.
    • Loại trả lại
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      12 cũng phải có thể nối tiếp JSON.
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      12 nên khớp với loại .NET bản đồ tốt nhất với loại JSON được trả về.
    • Một JS
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      14 được trả về cho các phương thức
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      15.
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      15 mở ra
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      14 và trả về giá trị được chờ đợi bởi
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      14.

    Đối với các ứng dụng Blazor có kích hoạt PRERENDERING, việc gọi vào JS là không thể thực hiện được. Để biết thêm thông tin, xem phần PRERENDERING.

    Ví dụ sau đây dựa trên

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    19, bộ giải mã dựa trên JS. Ví dụ cho thấy cách gọi hàm JS từ phương thức C# nhằm giảm tải yêu cầu từ mã nhà phát triển đến API JS hiện có. Hàm JS chấp nhận mảng byte từ phương thức C#, giải mã mảng và trả lại văn bản cho thành phần để hiển thị.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    2

    Thành phần

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    20 sau:
    • Gọi hàm
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      21 JS với InvokeAnync khi chọn nút (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      22).
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      22).
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      22
      ).
    • Sau khi hàm JS được gọi, mảng truyền được chuyển đổi thành một chuỗi. Chuỗi được trả về thành phần để hiển thị (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      23).
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    24:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    9

    API JavaScript giới hạn trong cử chỉ người dùng

    Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.

    Một số API JavaScript (JS) của Trình duyệt chỉ có thể được thực thi trong bối cảnh cử chỉ người dùng, chẳng hạn như sử dụng

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    25 (tài liệu MDN). Các API này không thể được gọi thông qua cơ chế Interop JS trong các ứng dụng máy chủ Blazor vì xử lý sự kiện UI được thực hiện không đồng bộ và thường không còn trong bối cảnh cử chỉ của người dùng. Ứng dụng phải xử lý hoàn toàn sự kiện giao diện người dùng trong JavaScript, vì vậy hãy sử dụng
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    26 thay vì thuộc tính chỉ thị
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    27 của Blazor.

    Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

    Sử dụng invokeVoidasync khi:

    • .NET không bắt buộc phải đọc kết quả của cuộc gọi JavaScript (JS).
    • Các hàm JS trả về void (0)/void 0 hoặc không xác định.

    Cung cấp chức năng

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    4

    Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    32 gọi phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    33 trong thành phần
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    34 sau đây.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    35:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    9

    Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    38:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    0
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    32 gọi phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    33 trong thành phần
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    41 sau đây.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    42:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    1

    Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

    Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JavaScript (JS).

    Cung cấp chức năng

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    2

    Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    32 gọi phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    48 và hiển thị chuỗi được trả về trong thành phần
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    49 sau.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    50:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    3

    Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    53:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    4
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    32 gọi phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    48 và hiển thị chuỗi được trả về trong thành phần
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    56 sau.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    57:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    5

    Kịch bản tạo nội dung động

    Để tạo nội dung động với buildrendertree, hãy sử dụng thuộc tính

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    58:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    6

    Prerendering

    Phần này áp dụng cho Blazor Server và lưu trữ các ứng dụng WebAssugging của Blazor mà các thành phần của Preerender Razor. Prerendering được đề cập trong các thành phần dao cạo ASP.NET Core tích hợp.

    Mặc dù một ứng dụng đang được bảo vệ, một số hành động nhất định, chẳng hạn như gọi vào JavaScript (JS), thì không thể.

    Ví dụ sau, hàm

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    59 được đặt bên trong phần tử
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    7

    Cảnh báo

    Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

    Sự kiện vòng đời

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    63:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    8

    Ghi chú

    Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

    Example:

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    9

    Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

    Ví dụ sau, hàm

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    59 được đặt bên trong phần tử
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    7

    Cảnh báo

    Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

    Sự kiện vòng đời

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    63:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    8

    Ghi chú

    Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

    Example:

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    2

    Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

    Ví dụ sau, hàm

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    64 được đặt bên trong phần tử
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

    Cảnh báo

    Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

    Trong trường hợp jsruntime.invokeasync được gọi, phần tử chỉ được sử dụng trong onAfterRenderAsync và không phải trong bất kỳ phương pháp vòng đời sớm hơn nào vì không có phần tử JS nào cho đến khi thành phần được hiển thị.

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    3
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    66 được gọi để tìm lại thành phần với trạng thái mới thu được từ cuộc gọi interop JS (để biết thêm thông tin, xem kết xuất thành phần dao cạo ASP.NET Core). Mã không tạo ra một vòng lặp vô hạn vì
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    66 chỉ được gọi khi
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    68 là
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    69.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    4

    Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor

    Phần này chỉ áp dụng cho các ứng dụng Webassugging của Blazor.

    • Các cuộc gọi interop của JS không đồng bộ theo mặc định, bất kể mã được gọi là đồng bộ hay không đồng bộ. Các cuộc gọi không đồng bộ theo mặc định để đảm bảo rằng các thành phần tương thích trên cả hai mô hình lưu trữ blazor, máy chủ blazor và webassebly blazor. Trên máy chủ Blazor, tất cả các cuộc gọi interop của JS phải không đồng bộ vì chúng được gửi qua kết nối mạng.
    • Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.
    • Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:
    • Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:
    • Vị trí của JavaScript

    Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):

    Cảnh báo

    Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

    Trong trường hợp jsruntime.invokeasync được gọi, phần tử chỉ được sử dụng trong onAfterRenderAsync và không phải trong bất kỳ phương pháp vòng đời sớm hơn nào vì không có phần tử JS nào cho đến khi thành phần được hiển thị.

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    3
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    66 được gọi để tìm lại thành phần với trạng thái mới thu được từ cuộc gọi interop JS (để biết thêm thông tin, xem kết xuất thành phần dao cạo ASP.NET Core). Mã không tạo ra một vòng lặp vô hạn vì
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    66 chỉ được gọi khi
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    68 là
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    69.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    4

    Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor

    • Phần này chỉ áp dụng cho các ứng dụng Webassugging của Blazor.
    • Các cuộc gọi interop của JS không đồng bộ theo mặc định, bất kể mã được gọi là đồng bộ hay không đồng bộ. Các cuộc gọi không đồng bộ theo mặc định để đảm bảo rằng các thành phần tương thích trên cả hai mô hình lưu trữ blazor, máy chủ blazor và webassebly blazor. Trên máy chủ Blazor, tất cả các cuộc gọi interop của JS phải không đồng bộ vì chúng được gửi qua kết nối mạng.

    Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    78:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    5

    Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:

    Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    80:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    6

    Vị trí của JavaScript

    • Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):
    • @if (TempData["myMessage"] != null)
      { 
          
      }
      
      66 được gọi để tìm lại thành phần với trạng thái mới thu được từ cuộc gọi interop JS (để biết thêm thông tin, xem kết xuất thành phần dao cạo ASP.NET Core). Mã không tạo ra một vòng lặp vô hạn vì
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      66 chỉ được gọi khi
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      68 là
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      69.
      • Đoạn đường dẫn cho thư mục hiện tại (
        @if (TempData["myMessage"] != null)
        { 
            
        }
        
        83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
      • Trình giữ chỗ
        @if (TempData["myMessage"] != null)
        { 
            
        }
        
        84 là đường dẫn và tên tệp theo
        @if (TempData["myMessage"] != null)
        { 
            
        }
        
        79.
    • Xóa bỏ IJSOBJECTREENTE cho bộ sưu tập rác trong IaSyncDisposable.DispoSeAnync.

    Nhập tự động một mô -đun yêu cầu mạng, do đó chỉ có thể đạt được không đồng bộ bằng cách gọi invokeasync.

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

    Ghi chú

    Khi tệp JS bên ngoài được cung cấp bởi thư viện lớp Dao cạo, chỉ định tệp JS của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    87:
    • Đoạn đường dẫn cho thư mục hiện tại (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
    • Trình giữ chỗ
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      89 là ID gói của thư viện. ID gói mặc định là tên lắp ráp của dự án nếu
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      90 không được chỉ định trong tệp dự án. Trong ví dụ sau, tên lắp ráp của thư viện là
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      91 và tệp dự án của thư viện không chỉ định
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      90.
    • Trình giữ chỗ
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      84 là đường dẫn và tên tệp theo
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      79. Trong ví dụ sau, tệp JS bên ngoài (
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      95) được đặt trong thư mục
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      79 của thư viện lớp.
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    7

    Để biết thêm thông tin, hãy xem tiêu thụ các thành phần dao cạo ASP.NET Core từ Thư viện lớp Dao cạo (RCL).

    Nắm bắt các tài liệu tham khảo về các yếu tố

    Một số kịch bản interop JavaScript (JS) yêu cầu tham chiếu đến các phần tử HTML. Ví dụ: thư viện UI có thể yêu cầu tham chiếu phần tử để khởi tạo hoặc bạn có thể cần gọi API giống như lệnh trên một phần tử, chẳng hạn như

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    97 hoặc
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    98.

    Chụp tham chiếu đến các phần tử HTML trong một thành phần bằng cách sử dụng phương pháp sau:

    • Thêm thuộc tính
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      99 vào phần tử HTML.
    • Xác định một trường thuộc loại loại có tên phù hợp với giá trị của thuộc tính
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      99.

    Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    01
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    02:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    8

    Cảnh báo

    Chỉ sử dụng tham chiếu phần tử để biến đổi nội dung của một phần tử trống không tương tác với Blazor. Kịch bản này rất hữu ích khi API của bên thứ ba cung cấp nội dung cho phần tử. Bởi vì Blazor không tương tác với yếu tố, không có khả năng xung đột giữa đại diện của Blazor về phần tử và mô hình đối tượng tài liệu (DOM).

    Trong ví dụ sau, thật nguy hiểm khi làm biến đổi nội dung của danh sách không có thứ tự (

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    03) vì Blazor tương tác với DOM để đưa ra các mục danh sách của yếu tố này (
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    04) từ đối tượng
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    05:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    9

    Nếu JS interop làm biến đổi nội dung của phần tử

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    06 và Blazor sẽ cố gắng áp dụng các khác biệt cho phần tử, thì các diff sẽ không khớp với DOM.

    Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

    Một yếu tố được chuyển qua mã JS thông qua JS Interop. Mã JS nhận được một ví dụ

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    07, nó có thể sử dụng với API DOM bình thường. Ví dụ: mã sau đây xác định phương thức mở rộng .NET (
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    08) cho phép gửi chuột nhấp vào một phần tử.

    Hàm JS

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    09 tạo ra một sự kiện
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    97 trên phần tử HTML được thông qua (
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    11):
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    0

    Để gọi hàm JS không trả về giá trị, hãy sử dụng jsruntimeExtensions.invokevoidasync. Mã sau đây kích hoạt sự kiện

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    97 phía máy khách bằng cách gọi chức năng JS trước đó với phần tử bị bắt:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    1

    Để sử dụng phương thức mở rộng, hãy tạo một phương thức mở rộng tĩnh để nhận cá thể ijsruntime:

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    2

    Phương thức

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    09 được gọi trực tiếp trên đối tượng. Ví dụ sau đây giả định rằng phương thức
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    08 có sẵn từ không gian tên
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    15:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    3

    Khi làm việc với các loại chung và trả về một giá trị, hãy sử dụng Valuetask:

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    4

    Trình giữ chỗ

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    16 là định danh hàm JS.
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    17 được gọi trực tiếp trên đối tượng với một loại. Ví dụ sau đây giả định rằng
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    17 có sẵn từ không gian tên
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    15:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    5

    Các yếu tố tham chiếu trên các thành phần

    Một yếu tố không thể được truyền giữa các thành phần bởi vì:

    • Ví dụ chỉ được đảm bảo tồn tại sau khi thành phần được hiển thị, trong hoặc sau khi phương thức OnAfterRinter/OnAfterRenderAsync của một thành phần thực thi.
    • Phần tử là một
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      20, không thể được truyền dưới dạng tham số thành phần.

    Đối với một thành phần cha mẹ để cung cấp một tham chiếu phần tử có sẵn cho các thành phần khác, thành phần cha mẹ có thể:

    • Cho phép các thành phần trẻ em đăng ký gọi lại.
    • Gọi các cuộc gọi lại đã đăng ký trong sự kiện OnAfterRender với tham chiếu phần tử được thông qua. Một cách gián tiếp, phương pháp này cho phép các thành phần con tương tác với tham chiếu phần tử của cha mẹ.
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    6
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    7
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    21 (Thành phần cha mẹ):
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    8
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    22:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    9

    Trong ví dụ trước, không gian tên của ứng dụng là

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    23 với các thành phần trong thư mục
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    25 (Thành phần con):
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    923
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }28:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    94

    Trong ví dụ trước, không gian tên của ứng dụng là

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    23 với các thành phần trong thư mục
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    25 (Thành phần con):
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    923
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }28:
    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    94

    [script.js] function buttonClick() { // this function triggers on button click } 23 với các thành phần được chia sẻ trong thư mục [script.js] function buttonClick() { // this function triggers on button click } 27. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.

    Harden javascript interop cuộc gọi

    Phần này chủ yếu áp dụng cho các ứng dụng Blazor Server, nhưng các ứng dụng Webassugging của Blazor cũng có thể đặt thời gian chờ JS Interop nếu điều kiện đảm bảo nó.

    Trong các ứng dụng máy chủ Blazor, interop JavaScript (JS) có thể thất bại do lỗi kết nối mạng và nên được coi là không đáng tin cậy. Theo mặc định, các ứng dụng Blazor Server sử dụng thời gian chờ một phút cho các cuộc gọi interop của JS. Nếu một ứng dụng có thể chịu đựng được thời gian chờ tích cực hơn, hãy đặt thời gian chờ bằng một trong các phương pháp sau.

    Đặt thời gian chờ toàn cầu trong

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    28 với CircuitOptions.jsInteropDefaultCallTimeout:
    1

    Người giữ chỗ

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    29 là một khoảng thời gian (ví dụ:
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    30).

    2

    Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

    • Trong ví dụ trước:
    • [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      29 là một khoảng thời gian (ví dụ:
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      30).

    Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    28 với CircuitOptions.jsInteropDefaultCallTimeout:
    1

    Người giữ chỗ

    [script.js] function buttonClick() { // this function triggers on button click } 29 là một khoảng thời gian (ví dụ: [script.js] function buttonClick() { // this function triggers on button click } 30).

    Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

    • Trong ví dụ trước:
    • Người giữ chỗ
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      29 là một khoảng thời gian (ví dụ:
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      30).

    [script.js] function buttonClick() { // this function triggers on button click } 33 là định danh cho hàm gọi. Ví dụ: giá trị @if (TempData["myMessage"] != null) { } 08 gọi hàm @if (TempData["myMessage"] != null) { } 07.

    Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.

    Để biết thêm thông tin về sự cạn kiệt tài nguyên, hãy xem Hướng dẫn giảm thiểu mối đe dọa cho máy chủ blazor ASP.NET Core.

    Tránh các tài liệu tham khảo đối tượng tròn

    3

    Các đối tượng có chứa các tham chiếu tròn không thể được tuần tự hóa trên máy khách cho một trong hai:

    Phương thức .NET gọi.

    Các cuộc gọi phương thức JavaScript từ C# khi loại trả về có tham chiếu tròn.

    Thư viện JavaScript hiển thị UI

    Đôi khi bạn có thể muốn sử dụng các thư viện JavaScript (JS) tạo ra các phần tử giao diện người dùng có thể nhìn thấy trong mô hình đối tượng tài liệu trình duyệt (DOM). Thoạt nhìn, điều này có vẻ khó khăn vì hệ thống khác biệt của Blazor phụ thuộc vào việc kiểm soát cây của các phần tử DOM và gặp lỗi nếu một số mã bên ngoài làm biến đổi cây dom và vô hiệu hóa cơ chế của nó để áp dụng các khác biệt. Đây không phải là một giới hạn cụ thể của Blazor. Thử thách tương tự xảy ra với bất kỳ khung UI dựa trên khác nhau.

    May mắn thay, thật đơn giản để nhúng UI được tạo ra bên ngoài trong một thành phần dao cạo UI một cách đáng tin cậy. Kỹ thuật được đề xuất là có mã thành phần (tệp

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    42:
    4

    @if (TempData["myMessage"] != null)
    { 
        
    }
    
    30) tạo ra một phần tử trống. Theo như hệ thống khác biệt của Blazor, phần tử luôn trống, vì vậy trình kết xuất không tái phát vào phần tử và thay vào đó để lại nội dung của nó một mình. Điều này làm cho nó an toàn để điền vào yếu tố với nội dung được quản lý bên ngoài tùy ý.

    Ví dụ sau đây chứng minh khái niệm. Trong câu lệnh

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    37 khi
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    38 là
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    39, tương tác với
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    40 bên ngoài blazor sử dụng JS Interop. Ví dụ: gọi thư viện JS bên ngoài để điền vào phần tử. Blazor để lại nội dung của phần tử một mình cho đến khi thành phần này được loại bỏ. Khi thành phần bị loại bỏ, toàn bộ Subtree của DOM cũng bị xóa.

    Hãy xem xét ví dụ sau đây hiển thị bản đồ tương tác bằng API MAPBox nguồn mở.

    • Mô -đun JS sau đây được đặt vào ứng dụng hoặc có sẵn từ thư viện lớp Dao cạo.
    • Ghi chú

    Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

    • Người giữ chỗ
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      33 là định danh cho hàm gọi. Ví dụ: giá trị
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      08 gọi hàm
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      07.not safe for external JS code to modify elements that Blazor does not regard as empty.not safe for external JS code to modify elements that Blazor does not regard as empty.
    • Khi sử dụng phương pháp này, hãy ghi nhớ các quy tắc về cách Blazor giữ lại hoặc phá hủy các yếu tố DOM. Thành phần xử lý an toàn nút Nhấp vào các sự kiện và cập nhật thể hiện bản đồ hiện có vì các phần tử DOM được giữ lại nếu có thể theo mặc định. Nếu bạn đang hiển thị một danh sách các phần tử MAP từ bên trong vòng lặp
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      50, bạn muốn sử dụng
      [script.js]
      function buttonClick() {
          // this function triggers on button click
      }
      
      51 để đảm bảo bảo tồn các phiên bản thành phần. Mặt khác, các thay đổi trong dữ liệu danh sách có thể khiến các trường hợp thành phần giữ lại trạng thái của các trường hợp trước đó theo cách không mong muốn. Để biết thêm thông tin, hãy xem bằng cách sử dụng @Key để bảo tồn các yếu tố và thành phần.@key to preserve elements and components.@key to preserve elements and components.
    • Ví dụ đóng gói logic và phụ thuộc JS trong mô -đun ES6 và tải mô -đun động bằng định danh
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      81. Để biết thêm thông tin, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

    Hỗ trợ mảng byte

    Blazor hỗ trợ interop mảng byte tối ưu hóa (JS) để tránh mã hóa/giải mã mảng byte vào base64. Ví dụ sau sử dụng JS Interop để chuyển một mảng byte cho JavaScript.

    Cung cấp chức năng

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    53 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
    7
    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    54:
    8

    Để biết thông tin về việc sử dụng mảng byte khi gọi .NET từ JavaScript, hãy xem các phương thức CALL .NET từ các hàm JavaScript trong Blazor ASP.NET Core.

    Giới hạn kích thước trên các cuộc gọi interop JavaScript

    Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor. Trong Blazor Webassugging, khung không áp đặt giới hạn về kích thước của các đầu vào và đầu ra interop JavaScript (JS).

    Trong máy chủ Blazor, các cuộc gọi interop JS bị giới hạn kích thước bằng kích thước tin nhắn tín hiệu đến tối đa được phép cho các phương thức trung tâm, được thực thi bởi HubOptions.MaximumReceIvemessagesize (mặc định: 32 kb). Các thông báo JS đến .NET Signalr lớn hơn MaximumReceIvemessagesize ném lỗi. Khung không áp đặt giới hạn về kích thước của tin nhắn SignalR từ trung tâm đến máy khách.

    Khi ghi nhật ký tín hiệu không được đặt thành gỡ lỗi hoặc theo dõi, lỗi kích thước tin nhắn chỉ xuất hiện trong bảng điều khiển công cụ phát triển của trình duyệt:

    Lỗi: Kết nối bị ngắt kết nối với lỗi 'Lỗi: Máy chủ đã trả về lỗi khi đóng: Kết nối đóng với lỗi.'.

    Khi ghi nhật ký phía máy chủ Signalr được đặt thành gỡ lỗi hoặc theo dõi, việc ghi nhật ký phía máy chủ sẽ không hợp lệ cho lỗi kích thước tin nhắn.

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    55:
    9

    Error:

    System.io.invaliddataException: Kích thước tin nhắn tối đa là 32768b đã bị vượt quá. Kích thước tin nhắn có thể được cấu hình trong AddHubOptions.

    Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong

    [script.js]
    function buttonClick() {
        // this function triggers on button click
    }
    
    28. Ví dụ sau đây đặt kích thước tin nhắn nhận tối đa thành 64 kb:
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
    
    
    @code {
        protected void onbuttonclick (MouseEventArgs args)
        {
            await jsRuntime.InvokeVoidAsync("buttonClick ");
        }
    }0

    Việc tăng giới hạn kích thước tin nhắn đến tín hiệu đến với chi phí yêu cầu nhiều tài nguyên máy chủ hơn và nó khiến máy chủ tăng rủi ro từ người dùng độc hại. Ngoài ra, việc đọc một lượng lớn nội dung trong bộ nhớ dưới dạng chuỗi hoặc mảng byte cũng có thể dẫn đến việc phân bổ hoạt động kém với bộ thu rác, dẫn đến các hình phạt hiệu suất bổ sung.

    Hãy xem xét hướng dẫn sau khi phát triển mã chuyển một lượng lớn dữ liệu giữa JS và Blazor trong các ứng dụng máy chủ Blazor:

    • Tận dụng hỗ trợ interop phát trực tuyến gốc để truyền dữ liệu lớn hơn giới hạn kích thước tin nhắn Signalr đến:
      • Gọi các chức năng JavaScript từ các phương thức .NET trong blazor Core ASP.NET
      • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
    • Mẹo chung:
      • Đừng phân bổ các đối tượng lớn trong mã JS và C#.
      • Bộ nhớ tiêu thụ miễn phí khi quá trình được hoàn thành hoặc hủy bỏ.
      • Thực thi các yêu cầu bổ sung sau đây cho mục đích bảo mật:
        • Khai báo tệp tối đa hoặc kích thước dữ liệu có thể được truyền.
        • Khai báo tỷ lệ tải lên tối thiểu từ máy khách lên máy chủ.
      • Sau khi máy chủ nhận được dữ liệu, dữ liệu có thể là:
        • Tạm thời được lưu trữ trong bộ đệm bộ nhớ cho đến khi tất cả các phân đoạn được thu thập.
        • Tiêu thụ ngay lập tức. Ví dụ: dữ liệu có thể được lưu trữ ngay lập tức trong cơ sở dữ liệu hoặc được ghi vào đĩa khi nhận được mỗi phân đoạn.

    JavaScript interop

    Các thành phần Webassugging của Blazor có thể trải nghiệm hiệu suất kém khi các đối tượng .NET được tuần tự hóa cho interop JavaScript (JS) và một trong những điều sau đây là đúng:

    • Một khối lượng lớn các đối tượng .NET được nối tiếp nhanh chóng. Ví dụ, hiệu suất kém có thể dẫn đến khi các cuộc gọi interop của JS được thực hiện trên cơ sở di chuyển một thiết bị đầu vào, chẳng hạn như quay bánh xe chuột.
    • Các đối tượng .NET lớn hoặc nhiều đối tượng .NET phải được tuần tự hóa cho JS Interop. Ví dụ, hiệu suất kém có thể dẫn đến khi các cuộc gọi interop JS yêu cầu tuần tự hóa hàng tá tệp.

    IJSunMarshalledObjectreeference đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi mà không có chi phí của dữ liệu .NET tuần tự.

    Trong ví dụ sau:

    • Một cấu trúc chứa một chuỗi và một số nguyên được truyền không bị không phát triển cho JS.
    • Các chức năng của JS xử lý dữ liệu và trả về boolean hoặc chuỗi cho người gọi.
    • Chuỗi JS không thể chuyển đổi trực tiếp thành đối tượng .NET
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }60. Hàm 
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }61 gọi 
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }62 để quản lý việc chuyển đổi chuỗi JS.

      Ghi chú

      Các ví dụ sau đây không phải là trường hợp sử dụng điển hình cho kịch bản này vì cấu trúc được chuyển cho JS không dẫn đến hiệu suất thành phần kém. Ví dụ sử dụng một đối tượng nhỏ chỉ để chứng minh các khái niệm để truyền dữ liệu .NET không bị hủy.

      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      05

      Cảnh báo

      Tên chức năng, hành vi và sự tồn tại của

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:
      • Chức năng có khả năng được đổi tên.
      • Bản thân chức năng có thể được loại bỏ có lợi cho việc tự động chuyển đổi các chuỗi bằng khung.
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }64:
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      06

      Nếu một phiên bản ijsunmarshalledobjectreeference không được xử lý trong mã C#, nó có thể được xử lý trong JS. Hàm

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS:
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      07

      Các loại mảng có thể được chuyển đổi từ các đối tượng JS thành các đối tượng .NET bằng

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }66, nhưng mảng JS phải là một mảng được đánh máy. Các mảng từ JS có thể được đọc trong mã C# dưới dạng mảng đối tượng .NET (
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }67).

      Các loại dữ liệu khác, chẳng hạn như mảng chuỗi, có thể được chuyển đổi nhưng yêu cầu tạo một đối tượng mảng đơn sắc mới (

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }68) và đặt giá trị của nó (
      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }69).

      Cảnh báo

      Tên chức năng, hành vi và sự tồn tại của

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:

      Chức năng có khả năng được đổi tên.

      Bản thân chức năng có thể được loại bỏ có lợi cho việc tự động chuyển đổi các chuỗi bằng khung.

      Nếu một phiên bản ijsunmarshalledobjectreeference không được xử lý trong mã C#, nó có thể được xử lý trong JS. Hàm

      [index.razor]
      @page "/"
      @inject IJSRuntime jsRuntime
      
      
      
      @code {
          protected void onbuttonclick (MouseEventArgs args)
          {
              await jsRuntime.InvokeVoidAsync("buttonClick ");
          }
      }65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS:
      @if (TempData["myMessage"] != null)
      { 
          
      }
      
      07
      • Các loại mảng có thể được chuyển đổi từ các đối tượng JS thành các đối tượng .NET bằng
      • [index.razor]
        @page "/"
        @inject IJSRuntime jsRuntime
        
        
        
        @code {
            protected void onbuttonclick (MouseEventArgs args)
            {
                await jsRuntime.InvokeVoidAsync("buttonClick ");
            }
        }66, nhưng mảng JS phải là một mảng được đánh máy. Các mảng từ JS có thể được đọc trong mã C# dưới dạng mảng đối tượng .NET (
        [index.razor]
        @page "/"
        @inject IJSRuntime jsRuntime
        
        
        
        @code {
            protected void onbuttonclick (MouseEventArgs args)
            {
                await jsRuntime.InvokeVoidAsync("buttonClick ");
            }
        }67).

        Các loại dữ liệu khác, chẳng hạn như mảng chuỗi, có thể được chuyển đổi nhưng yêu cầu tạo một đối tượng mảng đơn sắc mới (

        [index.razor]
        @page "/"
        @inject IJSRuntime jsRuntime
        
        
        
        @code {
            protected void onbuttonclick (MouseEventArgs args)
            {
                await jsRuntime.InvokeVoidAsync("buttonClick ");
            }
        }68) và đặt giá trị của nó (
        [index.razor]
        @page "/"
        @inject IJSRuntime jsRuntime
        
        
        
        @code {
            protected void onbuttonclick (MouseEventArgs args)
            {
                await jsRuntime.InvokeVoidAsync("buttonClick ");
            }
        }69).
        • [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:

          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }1
        • [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS:

          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }2

          Các loại mảng có thể được chuyển đổi từ các đối tượng JS thành các đối tượng .NET bằng

          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }66, nhưng mảng JS phải là một mảng được đánh máy. Các mảng từ JS có thể được đọc trong mã C# dưới dạng mảng đối tượng .NET (
          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }67).

          Các loại dữ liệu khác, chẳng hạn như mảng chuỗi, có thể được chuyển đổi nhưng yêu cầu tạo một đối tượng mảng đơn sắc mới (
          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }68) và đặt giá trị của nó (
          [index.razor]
          @page "/"
          @inject IJSRuntime jsRuntime
          
          
          
          @code {
              protected void onbuttonclick (MouseEventArgs args)
              {
                  await jsRuntime.InvokeVoidAsync("buttonClick ");
              }
          }69).
          • Các chức năng của JS được cung cấp bởi khung Blazor, chẳng hạn như
          • [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }66, 
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }68 và 
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }69, có thể thay đổi tên, thay đổi hành vi hoặc loại bỏ trong các bản phát hành .NET trong tương lai.

            Phát trực tuyến từ .NET đến JavaScript

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            61:

            Phát trực tuyến từ .NET đến JavaScript

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            62:

            Blazor hỗ trợ truyền phát dữ liệu trực tiếp từ .NET đến JavaScript. Các luồng được tạo bằng cách sử dụng dotNetStreamReference.

            DotNetStreamReference đại diện cho luồng .NET và sử dụng các tham số sau:

            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }3
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            57: Luồng được gửi đến JavaScript.

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            58: Xác định xem luồng còn mở sau khi truyền hay không. Nếu một giá trị không được cung cấp,
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            58 mặc định là
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            60.
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            68
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            69:
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }4

            Trong JavaScript, sử dụng bộ đệm mảng hoặc luồng có thể đọc được để nhận dữ liệu:

            Sử dụng

            Trong mã C#:

            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }5

            Trong ví dụ trước:

            • Trình giữ chỗ
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              81
              button is selected. A CancellationTokenSource is used to manage the execution of the long-running function. CancellationToken.Register sets a JS interop call delegate to execute the JS function
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              75 when the CancellationTokenSource.Token is cancelled.
            • [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              63 đại diện cho luồng được gửi đến JavaScript.
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              83
              button is selected, the CancellationTokenSource.Token is cancelled with a call to Cancel.
            • Hủy bỏ một chức năng JavaScript chạy dài
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            85:
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }6

            Sử dụng JS AbortControll với CancellationTokensource trong thành phần để hủy bỏ chức năng JavaScript dài từ mã C#.

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            7881 button is selected and when the function is aborted after the
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            83 button is selected:81 button is selected and when the function is aborted after the
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            83
            button is selected:

            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }7

            Lớp JS [script.js] function buttonClick() { // this function triggers on button click } 70 sau đây chứa một chức năng chạy dài mô phỏng, [script.js] function buttonClick() { // this function triggers on button click } 71, để đếm liên tục cho đến khi [script.js] function buttonClick() { // this function triggers on button click } 72 chỉ ra rằng [script.js] function buttonClick() { // this function triggers on button click } 73 đã được gọi. Hàm [script.js] function buttonClick() { // this function triggers on button click } 74 là nhằm mục đích trình diễn để mô phỏng việc thực hiện chậm chức năng chạy dài và sẽ không có trong mã sản xuất. Khi một thành phần gọi [script.js] function buttonClick() { // this function triggers on button click } 75, [script.js] function buttonClick() { // this function triggers on button click } 71 được báo hiệu hủy bỏ thông qua kiểm tra có điều kiện vòng lặp [script.js] function buttonClick() { // this function triggers on button click } 77 trên [script.js] function buttonClick() { // this function triggers on button click } 78.

            Thành phần

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            79 sau:

            Gọi hàm JS

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            71 khi nút
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            81 được chọn. Một CancellationTokensource được sử dụng để quản lý việc thực hiện chức năng chạy dài. CancellationToken.Register đặt một đại biểu cuộc gọi JS Interop để thực thi hàm JS
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            75 khi hủyStokensource.Token bị hủy.
            • Các cuộc gọi phương thức interop của JS
              • IJSRuntime.InvokeAsync
              • JSRuntimeExtensions.InvokeAsync
              • JSRuntimeExtensions.InvokeVoidAsync)
            • ________ 384/________ 395 kêu gọi bất kỳ ijsobjectreeference nào.

            Để tránh ghi nhật ký jsdisconnectedException hoặc để đăng nhập thông tin tùy chỉnh, hãy nắm bắt ngoại lệ trong câu lệnh

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            96.

            Đối với ví dụ xử lý thành phần sau:

            • Các thành phần thực hiện IAnyncDisposable.
            • [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              97 là một ijsobjectreeference.
            • JSDisconnectedException bị bắt và không ghi lại.
            • Tùy chọn, bạn có thể đăng nhập thông tin tùy chỉnh trong câu lệnh
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              66 ở bất kỳ cấp độ nhật ký nào bạn thích. Ví dụ sau đây không đăng nhập thông tin tùy chỉnh vì nó giả sử nhà phát triển không quan tâm đến việc khi hoặc nơi các mạch bị ngắt kết nối trong quá trình xử lý thành phần.
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }8

            Nếu bạn phải dọn sạch các đối tượng JS của riêng mình hoặc thực thi mã JS khác trên máy khách sau khi mất mạch, hãy sử dụng mẫu

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            99 trong JS trên máy khách.

            Để biết thêm thông tin, hãy xem các bài viết sau:

            • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core: Phần interop JavaScript thảo luận về việc xử lý lỗi trong các kịch bản interop JS.
            • Vòng đời thành phần dao cạo ASP.NET Core: Phần xử lý thành phần với phần
              00 và
              01 mô tả cách thực hiện các mẫu xử lý trong các thành phần dao cạo.

            Tài nguyên bổ sung

            • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
            • 02 Ví dụ (Kho lưu trữ GitHub của DOTNET/ASPNetCore
              03): Chi nhánh
              03 đại diện cho sự phát triển hiện tại của đơn vị sản phẩm cho bản phát hành tiếp theo của ASP.NET Core. Để chọn nhánh cho một bản phát hành khác (ví dụ:
              05), hãy sử dụng danh sách thả xuống nhánh hoặc thẻ chuyển đổi để chọn nhánh.Switch branches or tags dropdown list to select the branch.Switch branches or tags dropdown list to select the branch.
            • Kho lưu trữ Github mẫu Blazor (
              06)
            • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core (phần interop JavaScript)

            Để biết thông tin về cách gọi các phương thức .NET từ JS, hãy xem các phương thức gọi .NET từ các hàm JavaScript trong blazor ASP.NET Core.

            Để gọi vào JS từ .NET, tiêm Trừu tượng IJSruntime và gọi một trong các phương pháp sau:

            • IJSRuntime.InvokeAsync
            • JSRuntimeExtensions.InvokeAsync
            • JSRuntimeExtensions.InvokeVoidAsync

            Đối với các phương thức .NET trước đó gọi các hàm JS:

            • Mã định danh hàm (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              05) liên quan đến phạm vi toàn cầu (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              06). Để gọi
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              07, định danh là
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              08. Không cần phải đăng ký chức năng trước khi nó được gọi.
            • Chuyển bất kỳ số lượng đối số JSON-serializable trong
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              09 cho hàm JS.
            • Mã thông báo hủy bỏ (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              10) truyền một thông báo rằng các hoạt động nên bị hủy.
            • @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              11 thể hiện giới hạn thời gian cho hoạt động JS.
            • Loại trả lại
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              12 cũng phải có thể nối tiếp JSON.
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              12 nên khớp với loại .NET bản đồ tốt nhất với loại JSON được trả về.
            • Một JS
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              14 được trả về cho các phương thức
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              15.
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              15 mở ra
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              14 và trả về giá trị được chờ đợi bởi
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              14.

            Đối với các ứng dụng Blazor có kích hoạt PRERENDERING, việc gọi vào JS là không thể thực hiện được. Để biết thêm thông tin, xem phần PRERENDERING.

            Ví dụ sau đây dựa trên

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            19, bộ giải mã dựa trên JS. Ví dụ cho thấy cách gọi hàm JS từ phương thức C# nhằm giảm tải yêu cầu từ mã nhà phát triển đến API JS hiện có. Hàm JS chấp nhận mảng byte từ phương thức C#, giải mã mảng và trả lại văn bản cho thành phần để hiển thị.

            Thêm mã JS sau đây bên trong thẻ

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            232 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            233 (Blazor Webassugging) hoặc
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            234 (Máy chủ Blazor):
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            2

            Thành phần

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            20 sau:
            • Gọi hàm
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              21 JS với InvokeAnync khi chọn nút (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              22).
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              22).
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              22
              ).
            • Sau khi hàm JS được gọi, mảng truyền được chuyển đổi thành một chuỗi. Chuỗi được trả về thành phần để hiển thị (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              23).
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            24:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            9

            API JavaScript giới hạn trong cử chỉ người dùng

            Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.

            Một số API JavaScript (JS) của Trình duyệt chỉ có thể được thực thi trong bối cảnh cử chỉ người dùng, chẳng hạn như sử dụng

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            25 (tài liệu MDN). Các API này không thể được gọi thông qua cơ chế Interop JS trong các ứng dụng máy chủ Blazor vì xử lý sự kiện UI được thực hiện không đồng bộ và thường không còn trong bối cảnh cử chỉ của người dùng. Ứng dụng phải xử lý hoàn toàn sự kiện giao diện người dùng trong JavaScript, vì vậy hãy sử dụng
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            26 thay vì thuộc tính chỉ thị
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            27 của Blazor.

            Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

            Sử dụng invokeVoidasync khi:

            • .NET không bắt buộc phải đọc kết quả của một cuộc gọi JS.
            • Các hàm JS trả về void (0)/void 0 hoặc không xác định.

            Bên trong thẻ

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            232 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            233 (Blazor Webassugging) hoặc
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            234 (Máy chủ Blazor), cung cấp chức năng
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            4

            Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            33 trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            34 sau đây.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            35:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            19

            Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            38:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            20
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            33 trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            41 sau đây.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            42:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            21

            Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

            Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JS.

            Bên trong thẻ

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            232 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            233 (Blazor Webassugging) hoặc
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            234 (Máy chủ Blazor), cung cấp chức năng
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            4

            Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            33 trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            34 sau đây.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            35:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            19

            Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            38:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            20
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            33 trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            41 sau đây.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            42:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            21

            Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

            Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JS.

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            58:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            6

            @if (TempData["myMessage"] != null) { } 232 của @if (TempData["myMessage"] != null) { } 233 (blazor webassugging) hoặc @if (TempData["myMessage"] != null) { } 234 (máy chủ blazor), cung cấp chức năng @if (TempData["myMessage"] != null) { } 44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:@if (TempData["myMessage"] != null) { } 2

            Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            48 và hiển thị chuỗi được trả về trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            49 sau.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            50:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            23

            Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            53:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            24
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            32 gọi phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            48 và hiển thị chuỗi được trả về trong thành phần
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            56 sau.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            57:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            25

            Kịch bản tạo nội dung động

            Để tạo nội dung động với buildrendertree, hãy sử dụng thuộc tính Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

            Sự kiện vòng đời

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            63:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            8

            Ghi chú

            Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

            Example:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            9

            Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

            Ví dụ sau, hàm

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            64 được đặt bên trong phần tử
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            0

            Cảnh báo

            Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

            Sự kiện vòng đời

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.

            Ghi chú

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            70:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            1

            Ghi chú

            Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

            Example:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            2

            Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

            Ví dụ sau, hàm

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            64 được đặt bên trong phần tử
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            0

            Cảnh báo

            Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            3

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            64 được đặt bên trong phần tử
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            4

            Trong trường hợp jsruntime.invokeasync được gọi, phần tử chỉ được sử dụng trong onAfterRenderAsync và không phải trong bất kỳ phương pháp vòng đời sớm hơn nào vì không có phần tử JS nào cho đến khi thành phần được hiển thị.

            Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

            • Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:
            • Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:
            • Vị trí của JavaScript
            • Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):

            Tải một tập lệnh trong đánh dấu

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60 (thường không được khuyến nghị)

            Cảnh báo

            Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.

            @if (TempData["myMessage"] != null) { } 64 được đặt bên trong phần tử @if (TempData["myMessage"] != null) { } 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

            Trong trường hợp jsruntime.invokeasync được gọi, phần tử chỉ được sử dụng trong onAfterRenderAsync và không phải trong bất kỳ phương pháp vòng đời sớm hơn nào vì không có phần tử JS nào cho đến khi thành phần được hiển thị.

            Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

            • Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:
            • Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:

            Vị trí của JavaScript

            Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):

            Tải một tập lệnh trong đánh dấu

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60 (thường không được khuyến nghị)

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            79 và sau đó nhập mô -đun vào mã .NET bằng cách gọi invokeasync trên thể hiện ijsruntime.

            IJSruntime nhập mô -đun dưới dạng ijsobjectreeference, đại diện cho một tham chiếu đến đối tượng JS từ mã .NET. Sử dụng ijsobjectreeference để gọi các hàm JS đã xuất từ ​​mô -đun.

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            80:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            36

            Trong ví dụ trước:

            • Theo quy ước, định danh
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              81 là một định danh đặc biệt được sử dụng cụ thể để nhập mô -đun JS.
            • Chỉ định tệp JS bên ngoài của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              82, trong đó:
              • Đoạn đường dẫn cho thư mục hiện tại (
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
              • Trình giữ chỗ
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                84 là đường dẫn và tên tệp theo
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                79.

            Nhập tự động một mô -đun yêu cầu mạng, do đó chỉ có thể đạt được không đồng bộ bằng cách gọi invokeasync.

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

            Ghi chú

            Khi tệp JS bên ngoài được cung cấp bởi thư viện lớp Dao cạo, chỉ định tệp JS của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            87:
            • Đoạn đường dẫn cho thư mục hiện tại (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              83) được yêu cầu để tạo đường dẫn tài sản tĩnh chính xác đến tệp JS.
            • Trình giữ chỗ
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              84 là đường dẫn và tên tệp theo
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              79.
            • Nhập tự động một mô -đun yêu cầu mạng, do đó chỉ có thể đạt được không đồng bộ bằng cách gọi invokeasync.
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

            Ghi chú

            Khi tệp JS bên ngoài được cung cấp bởi thư viện lớp Dao cạo, chỉ định tệp JS của mô -đun bằng cách sử dụng đường dẫn tài sản web tĩnh ổn định của nó:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            87:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            7
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

            Trình giữ chỗ
            • @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              89 là ID gói của thư viện. ID gói mặc định là tên lắp ráp của dự án nếu
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              90 không được chỉ định trong tệp dự án. Trong ví dụ sau, tên lắp ráp của thư viện là
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              91 và tệp dự án của thư viện không chỉ định
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              90.
            • Trình giữ chỗ
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              84 là đường dẫn và tên tệp theo
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              79. Trong ví dụ sau, tệp JS bên ngoài (
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              95) được đặt trong thư mục
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              79 của thư viện lớp.

            Để biết thêm thông tin, hãy xem tiêu thụ các thành phần dao cạo ASP.NET Core từ Thư viện lớp Dao cạo (RCL).

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            8

            Nắm bắt các tài liệu tham khảo về các yếu tố

            Cảnh báo

            Không đặt thẻ

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            75 trong tệp thành phần (
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            30) vì thẻ
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            75 không thể được cập nhật một cách linh hoạt.

            Trong ví dụ sau, thật nguy hiểm khi làm biến đổi nội dung của danh sách không có thứ tự (

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            03) vì Blazor tương tác với DOM để đưa ra các mục danh sách của yếu tố này (
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            04) từ đối tượng
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            05:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            9

            Nếu JS interop làm biến đổi nội dung của phần tử

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            06 và Blazor sẽ cố gắng áp dụng các khác biệt cho phần tử, thì các diff sẽ không khớp với DOM.

            Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

            Một yếu tố được chuyển qua mã JS thông qua JS Interop. Mã JS nhận được một ví dụ

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            07, nó có thể sử dụng với API DOM bình thường. Ví dụ: mã sau đây xác định phương thức mở rộng .NET (
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            08) cho phép gửi chuột nhấp vào một phần tử.

            Hàm JS

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            09 tạo ra một sự kiện
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            97 trên phần tử HTML được thông qua (
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            11):
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            0

            Để gọi hàm JS không trả về giá trị, hãy sử dụng jsruntimeExtensions.invokevoidasync. Mã sau đây kích hoạt sự kiện

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            97 phía máy khách bằng cách gọi chức năng JS trước đó với phần tử bị bắt:
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            1

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            2

            Để sử dụng phương thức mở rộng, hãy tạo một phương thức mở rộng tĩnh để nhận cá thể ijsruntime:

            Phương thức

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            09 được gọi trực tiếp trên đối tượng. Ví dụ sau đây giả định rằng phương thức
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            08 có sẵn từ không gian tên
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            15:
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            3

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            4

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            7
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            86 đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi đồng bộ trong các ứng dụng Webassugging của Blazor. Để biết thêm thông tin, hãy xem phần Interop JS đồng bộ trong phần Ứng dụng Webassugging của Blazor.

            Trình giữ chỗ

            @if (TempData["myMessage"] != null) { } 89 là ID gói của thư viện. ID gói mặc định là tên lắp ráp của dự án nếu @if (TempData["myMessage"] != null) { } 90 không được chỉ định trong tệp dự án. Trong ví dụ sau, tên lắp ráp của thư viện là @if (TempData["myMessage"] != null) { } 91 và tệp dự án của thư viện không chỉ định @if (TempData["myMessage"] != null) { } 90.

            Trình giữ chỗ

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            84 là đường dẫn và tên tệp theo
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            79. Trong ví dụ sau, tệp JS bên ngoài (
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            95) được đặt trong thư mục
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            79 của thư viện lớp.

            • Để biết thêm thông tin, hãy xem tiêu thụ các thành phần dao cạo ASP.NET Core từ Thư viện lớp Dao cạo (RCL).
            • Nắm bắt các tài liệu tham khảo về các yếu tố

            Đối với một thành phần cha mẹ để cung cấp một tham chiếu phần tử có sẵn cho các thành phần khác, thành phần cha mẹ có thể:

            • Cho phép các thành phần trẻ em đăng ký gọi lại.
            • Gọi các cuộc gọi lại đã đăng ký trong sự kiện OnAfterRender với tham chiếu phần tử được thông qua. Một cách gián tiếp, phương pháp này cho phép các thành phần con tương tác với tham chiếu phần tử của cha mẹ.

            Thêm kiểu sau vào

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            60 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            233 (Blazor Webassugging) hoặc
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            234 (Máy chủ Blazor):
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            6

            Thêm tập lệnh sau đây bên trong Đóng

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            232 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            233 (Blazor Webassugging) hoặc
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            234 (Máy chủ Blazor):
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            7
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            21 (Thành phần cha mẹ):
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            8
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            22:
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            9

            Trong ví dụ trước, không gian tên của ứng dụng là

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            23 với các thành phần trong thư mục
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            25 (Thành phần con):
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            50
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }28:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            51

            Trong ví dụ trước, không gian tên của ứng dụng là

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            23 với các thành phần trong thư mục
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            25 (Thành phần con):
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            50
            [index.razor]
            @page "/"
            @inject IJSRuntime jsRuntime
            
            
            
            @code {
                protected void onbuttonclick (MouseEventArgs args)
                {
                    await jsRuntime.InvokeVoidAsync("buttonClick ");
                }
            }28:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            51

            [script.js] function buttonClick() { // this function triggers on button click } 23 với các thành phần được chia sẻ trong thư mục [script.js] function buttonClick() { // this function triggers on button click } 27. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.

            Harden javascript interop cuộc gọi

            Phần này chủ yếu áp dụng cho các ứng dụng Blazor Server, nhưng các ứng dụng Webassugging của Blazor cũng có thể đặt thời gian chờ JS Interop nếu điều kiện đảm bảo nó.

            Trong các ứng dụng máy chủ Blazor, interop JavaScript (JS) có thể thất bại do lỗi kết nối mạng và nên được coi là không đáng tin cậy. Theo mặc định, các ứng dụng Blazor Server sử dụng thời gian chờ một phút cho các cuộc gọi interop của JS. Nếu một ứng dụng có thể chịu đựng được thời gian chờ tích cực hơn, hãy đặt thời gian chờ bằng một trong các phương pháp sau.

            Đặt thời gian chờ toàn cầu trong phương thức

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            955 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            956 với CircuitOptions.jsInteropDefaultCallTimeout:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            52

            Người giữ chỗ

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            29 là một khoảng thời gian (ví dụ:
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            30).

            2

            Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

            • Trong ví dụ trước:
            • [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              29 là một khoảng thời gian (ví dụ:
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              30).

            Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            955 của
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            956 với CircuitOptions.jsInteropDefaultCallTimeout:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            52

            Người giữ chỗ

            [script.js] function buttonClick() { // this function triggers on button click } 29 là một khoảng thời gian (ví dụ: [script.js] function buttonClick() { // this function triggers on button click } 30).

            Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

            • Trong ví dụ trước:
            • Người giữ chỗ
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              29 là một khoảng thời gian (ví dụ:
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              30).

            [script.js] function buttonClick() { // this function triggers on button click } 33 là định danh cho hàm gọi. Ví dụ: giá trị @if (TempData["myMessage"] != null) { } 08 gọi hàm @if (TempData["myMessage"] != null) { } 07.

            Tránh các tài liệu tham khảo đối tượng tròn

            Các đối tượng có chứa các tham chiếu tròn không thể được tuần tự hóa trên máy khách cho một trong hai:

            Phương thức .NET gọi.

            Các cuộc gọi phương thức JavaScript từ C# khi loại trả về có tham chiếu tròn.

            Thư viện JavaScript hiển thị UI

            Đôi khi bạn có thể muốn sử dụng các thư viện JavaScript (JS) tạo ra các phần tử giao diện người dùng có thể nhìn thấy trong mô hình đối tượng tài liệu trình duyệt (DOM). Thoạt nhìn, điều này có vẻ khó khăn vì hệ thống khác biệt của Blazor phụ thuộc vào việc kiểm soát cây của các phần tử DOM và gặp lỗi nếu một số mã bên ngoài làm biến đổi cây dom và vô hiệu hóa cơ chế của nó để áp dụng các khác biệt. Đây không phải là một giới hạn cụ thể của Blazor. Thử thách tương tự xảy ra với bất kỳ khung UI dựa trên khác nhau.

            May mắn thay, thật đơn giản để nhúng UI được tạo ra bên ngoài trong một thành phần dao cạo UI một cách đáng tin cậy. Kỹ thuật được đề xuất là có mã thành phần (tệp

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            30) tạo ra một phần tử trống. Theo như hệ thống khác biệt của Blazor, phần tử luôn trống, vì vậy trình kết xuất không tái phát vào phần tử và thay vào đó để lại nội dung của nó một mình. Điều này làm cho nó an toàn để điền vào yếu tố với nội dung được quản lý bên ngoài tùy ý.

            Ví dụ sau đây chứng minh khái niệm. Trong câu lệnh

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            37 khi
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            38 là
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            39, tương tác với
            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            40 bên ngoài blazor sử dụng JS Interop. Ví dụ: gọi thư viện JS bên ngoài để điền vào phần tử. Blazor để lại nội dung của phần tử một mình cho đến khi thành phần này được loại bỏ. Khi thành phần bị loại bỏ, toàn bộ Subtree của DOM cũng bị xóa.
            3

            Hãy xem xét ví dụ sau đây hiển thị bản đồ tương tác bằng API MAPBox nguồn mở.

            Mô -đun JS sau đây được đặt vào ứng dụng hoặc có sẵn từ thư viện lớp Dao cạo.

            Ghi chú

            Ví dụ trước tạo ra UI bản đồ tương tác. Người dùng:

            • Có thể kéo để cuộn hoặc phóng to.
            • Chọn các nút để nhảy đến các vị trí được xác định trước.

            Trong ví dụ trước:

            • [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              47 với
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              48 bị bỏ trống khi có liên quan đến Blazor. Tập lệnh
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              49 có thể điền vào phần tử một cách an toàn và sửa đổi nội dung của nó. Sử dụng kỹ thuật này với bất kỳ thư viện JS nào hiển thị UI. Bạn có thể nhúng các thành phần từ khung JS Spa của bên thứ ba bên trong các thành phần dao cạo, miễn là chúng không cố gắng tiếp cận và sửa đổi các phần khác của trang. Không an toàn cho mã JS bên ngoài để sửa đổi các yếu tố mà Blazor không coi là trống.not safe for external JS code to modify elements that Blazor does not regard as empty.not safe for external JS code to modify elements that Blazor does not regard as empty.
            • Khi sử dụng phương pháp này, hãy ghi nhớ các quy tắc về cách Blazor giữ lại hoặc phá hủy các yếu tố DOM. Thành phần xử lý an toàn nút Nhấp vào các sự kiện và cập nhật thể hiện bản đồ hiện có vì các phần tử DOM được giữ lại nếu có thể theo mặc định. Nếu bạn đang hiển thị một danh sách các phần tử MAP từ bên trong vòng lặp
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              50, bạn muốn sử dụng
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              51 để đảm bảo bảo tồn các phiên bản thành phần. Mặt khác, các thay đổi trong dữ liệu danh sách có thể khiến các trường hợp thành phần giữ lại trạng thái của các trường hợp trước đó theo cách không mong muốn. Để biết thêm thông tin, hãy xem bằng cách sử dụng @Key để bảo tồn các yếu tố và thành phần.@key to preserve elements and components.@key to preserve elements and components.
            • Ví dụ đóng gói logic và phụ thuộc JS trong mô -đun ES6 và tải mô -đun động bằng định danh
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              81. Để biết thêm thông tin, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

            Giới hạn kích thước trên các cuộc gọi interop JavaScript

            Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor. Trong Blazor Webassugging, khung không áp đặt giới hạn về kích thước của các đầu vào và đầu ra interop JavaScript (JS).

            Trong máy chủ Blazor, các cuộc gọi interop JS bị giới hạn kích thước bằng kích thước tin nhắn tín hiệu đến tối đa được phép cho các phương thức trung tâm, được thực thi bởi HubOptions.MaximumReceIvemessagesize (mặc định: 32 kb). Các thông báo JS đến .NET Signalr lớn hơn MaximumReceIvemessagesize ném lỗi. Khung không áp đặt giới hạn về kích thước của tin nhắn SignalR từ trung tâm đến máy khách.

            Khi ghi nhật ký tín hiệu không được đặt thành gỡ lỗi hoặc theo dõi, lỗi kích thước tin nhắn chỉ xuất hiện trong bảng điều khiển công cụ phát triển của trình duyệt:

            Lỗi: Kết nối bị ngắt kết nối với lỗi 'Lỗi: Máy chủ đã trả về lỗi khi đóng: Kết nối đóng với lỗi.'.

            Khi ghi nhật ký phía máy chủ Signalr được đặt thành gỡ lỗi hoặc theo dõi, việc ghi nhật ký phía máy chủ sẽ không hợp lệ cho lỗi kích thước tin nhắn.

            [script.js]
            function buttonClick() {
                // this function triggers on button click
            }
            
            55:
            9

            Error:

            System.io.invaliddataException: Kích thước tin nhắn tối đa là 32768b đã bị vượt quá. Kích thước tin nhắn có thể được cấu hình trong AddHubOptions.

            Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            955:
            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            59

            Việc tăng giới hạn kích thước tin nhắn đến tín hiệu đến với chi phí yêu cầu nhiều tài nguyên máy chủ hơn và nó khiến máy chủ tăng rủi ro từ người dùng độc hại. Ngoài ra, việc đọc một lượng lớn nội dung trong bộ nhớ dưới dạng chuỗi hoặc mảng byte cũng có thể dẫn đến việc phân bổ hoạt động kém với bộ thu rác, dẫn đến các hình phạt hiệu suất bổ sung.

            Một tùy chọn để đọc tải trọng lớn là gửi nội dung trong các khối nhỏ hơn và xử lý tải trọng dưới dạng luồng. Điều này có thể được sử dụng khi đọc tải trọng JSON lớn hoặc nếu dữ liệu có sẵn trong JS dưới dạng byte thô. Để biết ví dụ chứng minh việc gửi tải trọng nhị phân lớn trong máy chủ Blazor sử dụng các kỹ thuật tương tự như thành phần

            @if (TempData["myMessage"] != null)
            { 
                
            }
            
            984, hãy xem ứng dụng mẫu gửi nhị phân.

            Hãy xem xét hướng dẫn sau khi phát triển mã chuyển một lượng lớn dữ liệu giữa JS và Blazor trong các ứng dụng máy chủ Blazor:

            • Cắt dữ liệu thành các phần nhỏ hơn và gửi các phân đoạn dữ liệu một cách tuần tự cho đến khi tất cả các dữ liệu được máy chủ nhận được.
            • Đừng phân bổ các đối tượng lớn trong mã JS và C#.
            • Đừng chặn luồng UI chính trong thời gian dài khi gửi hoặc nhận dữ liệu.
            • Bộ nhớ tiêu thụ miễn phí khi quá trình được hoàn thành hoặc hủy bỏ.
            • Thực thi các yêu cầu bổ sung sau đây cho mục đích bảo mật:
              • Khai báo tệp tối đa hoặc kích thước dữ liệu có thể được truyền.
              • Khai báo tỷ lệ tải lên tối thiểu từ máy khách lên máy chủ.
            • Sau khi máy chủ nhận được dữ liệu, dữ liệu có thể là:
              • Tạm thời được lưu trữ trong bộ đệm bộ nhớ cho đến khi tất cả các phân đoạn được thu thập.
              • Tiêu thụ ngay lập tức. Ví dụ: dữ liệu có thể được lưu trữ ngay lập tức trong cơ sở dữ liệu hoặc được ghi vào đĩa khi nhận được mỗi phân đoạn.

            JavaScript interop

            Các thành phần Webassugging của Blazor có thể trải nghiệm hiệu suất kém khi các đối tượng .NET được tuần tự hóa cho interop JavaScript (JS) và một trong những điều sau đây là đúng:

            • Một khối lượng lớn các đối tượng .NET được nối tiếp nhanh chóng. Ví dụ, hiệu suất kém có thể dẫn đến khi các cuộc gọi interop của JS được thực hiện trên cơ sở di chuyển một thiết bị đầu vào, chẳng hạn như quay bánh xe chuột.
            • Các đối tượng .NET lớn hoặc nhiều đối tượng .NET phải được tuần tự hóa cho JS Interop. Ví dụ, hiệu suất kém có thể dẫn đến khi các cuộc gọi interop JS yêu cầu tuần tự hóa hàng tá tệp.

            IJSunMarshalledObjectreeference đại diện cho một tham chiếu đến một đối tượng JS có các chức năng có thể được gọi mà không có chi phí của dữ liệu .NET tuần tự.

            Trong ví dụ sau:

            • Một cấu trúc chứa một chuỗi và một số nguyên được truyền không bị không phát triển cho JS.
            • Các chức năng của JS xử lý dữ liệu và trả về boolean hoặc chuỗi cho người gọi.
            • Chuỗi JS không thể chuyển đổi trực tiếp thành đối tượng .NET
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }60. Hàm 
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }61 gọi 
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }62 để quản lý việc chuyển đổi chuỗi JS.

              Ghi chú

              Các ví dụ sau đây không phải là trường hợp sử dụng điển hình cho kịch bản này vì cấu trúc được chuyển cho JS không dẫn đến hiệu suất thành phần kém. Ví dụ sử dụng một đối tượng nhỏ chỉ để chứng minh các khái niệm để truyền dữ liệu .NET không bị hủy.

              Đặt khối

              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              75 sau trong
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              233 (Blazor Webassugging) hoặc
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              234 (Máy chủ Blazor). Ngoài ra, bạn có thể đặt JS vào tệp JS bên ngoài được tham chiếu bên trong thẻ
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              232 đóng với
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              992, trong đó trình giữ chỗ
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              993 là đường dẫn và tên tệp của tập lệnh.
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              05

              Cảnh báo

              Tên chức năng, hành vi và sự tồn tại của

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:
              • Chức năng có khả năng được đổi tên.
              • Bản thân chức năng có thể được loại bỏ có lợi cho việc tự động chuyển đổi các chuỗi bằng khung.
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }64:
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              61

              Nếu một phiên bản ijsunmarshalledobjectreeference không được xử lý trong mã C#, nó có thể được xử lý trong JS. Hàm

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS:
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              07

              Các loại mảng có thể được chuyển đổi từ các đối tượng JS thành các đối tượng .NET bằng

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }66, nhưng mảng JS phải là một mảng được đánh máy. Các mảng từ JS có thể được đọc trong mã C# dưới dạng mảng đối tượng .NET (
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }67).

              Các loại dữ liệu khác, chẳng hạn như mảng chuỗi, có thể được chuyển đổi nhưng yêu cầu tạo một đối tượng mảng đơn sắc mới (

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }68) và đặt giá trị của nó (
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }69).

              Cảnh báo

              Tên chức năng, hành vi và sự tồn tại của

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:

              Chức năng có khả năng được đổi tên.

              Bản thân chức năng có thể được loại bỏ có lợi cho việc tự động chuyển đổi các chuỗi bằng khung.

              Nếu một phiên bản ijsunmarshalledobjectreeference không được xử lý trong mã C#, nó có thể được xử lý trong JS. Hàm

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS:
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              07
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              68
              [script.js]
              function buttonClick() {
                  // this function triggers on button click
              }
              
              69:
              @if (TempData["myMessage"] != null)
              { 
                  
              }
              
              63

              Các loại mảng có thể được chuyển đổi từ các đối tượng JS thành các đối tượng .NET bằng

              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }66, nhưng mảng JS phải là một mảng được đánh máy. Các mảng từ JS có thể được đọc trong mã C# dưới dạng mảng đối tượng .NET (
              [index.razor]
              @page "/"
              @inject IJSRuntime jsRuntime
              
              
              
              @code {
                  protected void onbuttonclick (MouseEventArgs args)
                  {
                      await jsRuntime.InvokeVoidAsync("buttonClick ");
                  }
              }67).

              Các loại dữ liệu khác, chẳng hạn như mảng chuỗi, có thể được chuyển đổi nhưng yêu cầu tạo một đối tượng mảng đơn sắc mới (

              • [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }68) và đặt giá trị của nó (
                [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }69).
                • IJSRuntime.InvokeAsync
                • JSRuntimeExtensions.InvokeAsync
                • Bắt các ngoại lệ JavaScript
              • Để bắt các ngoại lệ của JS, hãy kết thúc khối JS trong khối ________ 365 -____ ____ 366 và bắt một JSException.
              • Trong ví dụ sau, hàm

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                96.

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                67 JS không tồn tại. Khi chức năng không được tìm thấy, JSException bị mắc kẹt với một thông báo cho biết lỗi sau:

                • JavaScript interop gọi không có mạch
                • Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.
                • Không thể phát hành các cuộc gọi interop JavaScript (JS) sau khi ngắt kết nối mạch tín hiệu. Nếu không có mạch trong quá trình xử lý thành phần hoặc bất cứ lúc nào đó không tồn tại mạch, phương thức sau đây sẽ không thành công và đăng nhập thông báo rằng mạch bị ngắt kết nối dưới dạng JSDisconnectedException:
                • Các cuộc gọi phương thức interop của JS
                [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }8

                JSRuntimeExtensions.InvokeVoidAsync)

                ________ 384/________ 395 kêu gọi bất kỳ ijsobjectreeference nào.

                Để tránh ghi nhật ký jsdisconnectedException hoặc để đăng nhập thông tin tùy chỉnh, hãy nắm bắt ngoại lệ trong câu lệnh

                • Đối với ví dụ xử lý thành phần sau:
                • Vòng đời thành phần dao cạo ASP.NET Core: Phần xử lý thành phần với phần
                  00 và
                  01 mô tả cách thực hiện các mẫu xử lý trong các thành phần dao cạo.

                Tài nguyên bổ sung

                • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
                • 02 Ví dụ (Kho lưu trữ GitHub của DOTNET/ASPNetCore
                  03): Chi nhánh
                  03 đại diện cho sự phát triển hiện tại của đơn vị sản phẩm cho bản phát hành tiếp theo của ASP.NET Core. Để chọn nhánh cho một bản phát hành khác (ví dụ:
                  05), hãy sử dụng danh sách thả xuống nhánh hoặc thẻ chuyển đổi để chọn nhánh.Switch branches or tags dropdown list to select the branch.Switch branches or tags dropdown list to select the branch.
                • Kho lưu trữ Github mẫu Blazor (
                  06)
                • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core (phần interop JavaScript)

                Để biết thông tin về cách gọi các phương thức .NET từ JS, hãy xem các phương thức gọi .NET từ các hàm JavaScript trong blazor ASP.NET Core.

                Để gọi vào JS từ .NET, tiêm Trừu tượng IJSruntime và gọi một trong các phương pháp sau:

                • IJSRuntime.InvokeAsync
                • JSRuntimeExtensions.InvokeAsync
                • JSRuntimeExtensions.InvokeVoidAsync

                Đối với các phương thức .NET trước đó gọi các hàm JS:

                • Mã định danh hàm (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  05) liên quan đến phạm vi toàn cầu (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  06). Để gọi
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  07, định danh là
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  08. Không cần phải đăng ký chức năng trước khi nó được gọi.
                • Chuyển bất kỳ số lượng đối số JSON-serializable trong
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  09 cho hàm JS.
                • Mã thông báo hủy bỏ (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  10) truyền một thông báo rằng các hoạt động nên bị hủy.
                • @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  11 thể hiện giới hạn thời gian cho hoạt động JS.
                • Loại trả lại
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  12 cũng phải có thể nối tiếp JSON.
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  12 nên khớp với loại .NET bản đồ tốt nhất với loại JSON được trả về.
                • Một JS
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  14 được trả về cho các phương thức
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  15.
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  15 mở ra
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  14 và trả về giá trị được chờ đợi bởi
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  14.

                Đối với các ứng dụng Blazor có kích hoạt PRERENDERING, việc gọi vào JS là không thể thực hiện được. Để biết thêm thông tin, xem phần PRERENDERING.

                Ví dụ sau đây dựa trên

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                19, bộ giải mã dựa trên JS. Ví dụ cho thấy cách gọi hàm JS từ phương thức C# nhằm giảm tải yêu cầu từ mã nhà phát triển đến API JS hiện có. Hàm JS chấp nhận mảng byte từ phương thức C#, giải mã mảng và trả lại văn bản cho thành phần để hiển thị.

                Thêm mã JS sau đây bên trong thẻ

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                232 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                233 (Blazor Webassugging) hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                234 (Máy chủ Blazor):
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                2

                Thành phần

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                20 sau:
                • Gọi hàm
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  21 JS với InvokeAnync khi chọn nút (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  22).
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  22).
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  22
                  ).
                • Sau khi hàm JS được gọi, mảng truyền được chuyển đổi thành một chuỗi. Chuỗi được trả về thành phần để hiển thị (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  23).
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                24:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                66

                API JavaScript giới hạn trong cử chỉ người dùng

                Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.

                Một số API JavaScript (JS) của Trình duyệt chỉ có thể được thực thi trong bối cảnh cử chỉ người dùng, chẳng hạn như sử dụng

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                25 (tài liệu MDN). Các API này không thể được gọi thông qua cơ chế Interop JS trong các ứng dụng máy chủ Blazor vì xử lý sự kiện UI được thực hiện không đồng bộ và thường không còn trong bối cảnh cử chỉ của người dùng. Ứng dụng phải xử lý hoàn toàn sự kiện giao diện người dùng trong JavaScript, vì vậy hãy sử dụng
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                26 thay vì thuộc tính chỉ thị
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                27 của Blazor.

                Gọi các hàm JavaScript mà không cần đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

                Sử dụng invokeVoidasync khi:

                • .NET không bắt buộc phải đọc kết quả của một cuộc gọi JS.
                • Các hàm JS trả về void (0)/void 0 hoặc không xác định.

                Bên trong thẻ

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                232 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                233 (Blazor Webassugging) hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                234 (Máy chủ Blazor), cung cấp chức năng
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                4

                Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                32 gọi phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                33 trong thành phần
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                34 sau đây.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                35:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                68

                Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28)

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                38:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                20
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                32 gọi phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                33 trong thành phần
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                41 sau đây.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                42:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                70

                Gọi các hàm JavaScript và đọc giá trị trả về (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

                Sử dụng InvokeAnync khi .NET nên đọc kết quả của cuộc gọi JS.

                Bên trong thẻ

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                232 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                233 (blazor webassugging) hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                234 (máy chủ blazor), cung cấp chức năng
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                2

                Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                32 gọi phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                48 và hiển thị chuỗi được trả về trong thành phần
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                49 sau.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                50:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                72

                Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15)

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                53:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                24
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                32 gọi phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                48 và hiển thị chuỗi được trả về trong thành phần
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                56 sau.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                57:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                74

                Kịch bản tạo nội dung động

                Để tạo nội dung động với buildrendertree, hãy sử dụng thuộc tính

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                58:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                6

                Prerendering

                Phần này áp dụng cho Blazor Server và lưu trữ các ứng dụng WebAssugging của Blazor mà các thành phần của Preerender Razor. Prerendering được đề cập trong các thành phần dao cạo ASP.NET Core tích hợp.

                Mặc dù một ứng dụng đang được bảo vệ, một số hành động nhất định, chẳng hạn như gọi vào JavaScript (JS), thì không thể.

                Ví dụ sau, hàm

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                59 được đặt bên trong phần tử
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                7

                Cảnh báo

                Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

                Sự kiện vòng đời

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                63:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                8

                Ghi chú

                Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

                Example:

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                9

                Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

                Ví dụ sau, hàm

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                59 được đặt bên trong phần tử
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                7

                Cảnh báo

                Ví dụ trước sửa đổi trực tiếp mô hình đối tượng tài liệu (DOM) cho mục đích trình diễn. Trực tiếp sửa đổi DOM với JS không được khuyến nghị trong hầu hết các tình huống vì JS có thể can thiệp vào theo dõi thay đổi của Blazor. Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop). Directly modifying the DOM with JS isn't recommended in most scenarios because JS can interfere with Blazor's change tracking. For more information, see ASP.NET Core Blazor JavaScript interoperability (JS interop).

                Sự kiện vòng đời

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                63:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                8

                Ghi chú

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                70:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                1

                Ghi chú

                Ví dụ trước làm ô nhiễm khách hàng bằng các phương pháp toàn cầu. Để có cách tiếp cận tốt hơn trong các ứng dụng sản xuất, hãy xem sự cô lập JavaScript trong các mô -đun JavaScript.

                Example:

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                2

                Thành phần sau đây cho thấy cách sử dụng JS Interop như một phần của logic khởi tạo của thành phần theo cách tương thích với Prerendering. Thành phần cho thấy rằng có thể kích hoạt bản cập nhật kết xuất từ ​​bên trong OnAfterRenderAsync. Nhà phát triển phải cẩn thận để tránh tạo ra một vòng lặp vô hạn trong kịch bản này.

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                64 được đặt bên trong phần tử
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                0

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                61 để trì hoãn các cuộc gọi interop JS cho đến khi thành phần được hiển thị và tương tác trên máy khách sau khi giải quyết.

                Nếu bạn biết chắc chắn rằng ứng dụng của bạn chỉ chạy trên Blazor Webassugging, bạn có thể chọn thực hiện các cuộc gọi interop JS đồng bộ. Điều này có chi phí thấp hơn một chút so với thực hiện các cuộc gọi không đồng bộ và có thể dẫn đến ít chu kỳ kết xuất hơn vì không có trạng thái trung gian trong khi chờ kết quả.

                Để thực hiện một cuộc gọi đồng bộ từ .NET đến JavaScript trong một ứng dụng Webassugging của Blazor, hãy chọn ijsruntime đến ijsinprocessruntime để thực hiện cuộc gọi interop JS:

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                3

                Khi làm việc với ijsobjectreeference trong các ứng dụng WebAssugging của ASP.NET Core 5.0 hoặc sau đó, bạn có thể sử dụng IJSInProcessObjectreeference đồng bộ thay thế: thay vào đó:

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                4

                Vị trí của JavaScript

                Tải mã JavaScript (JS) bằng bất kỳ cách tiếp cận nào được mô tả bởi Tổng quan về khả năng tương tác JavaScript (JS) (Interop):

                • Tải một tập lệnh trong đánh dấu
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  60 (thường không được khuyến nghị)
                • Tải một tập lệnh trong đánh dấu
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  72
                • Tải tập lệnh từ tệp JS bên ngoài (
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  73)
                • Tiêm một tập lệnh sau khi blazor bắt đầu

                Cảnh báo

                Không đặt thẻ

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                75 trong tệp thành phần (
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                30) vì thẻ
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                75 không thể được cập nhật một cách linh hoạt.

                Nắm bắt các tài liệu tham khảo về các yếu tố

                Một số kịch bản interop JavaScript (JS) yêu cầu tham chiếu đến các phần tử HTML. Ví dụ: thư viện UI có thể yêu cầu tham chiếu phần tử để khởi tạo hoặc bạn có thể cần gọi API giống như lệnh trên một phần tử, chẳng hạn như

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                97 hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                98.

                Chụp tham chiếu đến các phần tử HTML trong một thành phần bằng cách sử dụng phương pháp sau:

                • Thêm thuộc tính
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  99 vào phần tử HTML.
                • Xác định một trường thuộc loại loại có tên phù hợp với giá trị của thuộc tính
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  99.

                Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                01
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                02:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                8

                Cảnh báo

                Không đặt thẻ

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                75 trong tệp thành phần (
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                30) vì thẻ
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                75 không thể được cập nhật một cách linh hoạt.

                Nắm bắt các tài liệu tham khảo về các yếu tố

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                9

                Một số kịch bản interop JavaScript (JS) yêu cầu tham chiếu đến các phần tử HTML. Ví dụ: thư viện UI có thể yêu cầu tham chiếu phần tử để khởi tạo hoặc bạn có thể cần gọi API giống như lệnh trên một phần tử, chẳng hạn như

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                97 hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                98.

                Chụp tham chiếu đến các phần tử HTML trong một thành phần bằng cách sử dụng phương pháp sau:

                Thêm thuộc tính

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                99 vào phần tử HTML.

                Xác định một trường thuộc loại loại có tên phù hợp với giá trị của thuộc tính
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                99.

                Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                99.
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                0

                Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                01
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                02:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                8

                Thêm thuộc tính

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                2

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                99 vào phần tử HTML.

                Xác định một trường thuộc loại loại có tên phù hợp với giá trị của thuộc tính

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                01
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                02:
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                1

                Chỉ sử dụng tham chiếu phần tử để biến đổi nội dung của một phần tử trống không tương tác với Blazor. Kịch bản này rất hữu ích khi API của bên thứ ba cung cấp nội dung cho phần tử. Bởi vì Blazor không tương tác với yếu tố, không có khả năng xung đột giữa đại diện của Blazor về phần tử và mô hình đối tượng tài liệu (DOM).

                Trong ví dụ sau, thật nguy hiểm khi làm biến đổi nội dung của danh sách không có thứ tự (

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                03) vì Blazor tương tác với DOM để đưa ra các mục danh sách của yếu tố này (
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                04) từ đối tượng
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                05:
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                3

                Nếu JS interop làm biến đổi nội dung của phần tử

                [script.js] function buttonClick() { // this function triggers on button click } 06 và Blazor sẽ cố gắng áp dụng các khác biệt cho phần tử, thì các diff sẽ không khớp với DOM.[script.js] function buttonClick() { // this function triggers on button click } 4

                Để biết thêm thông tin, hãy xem Khả năng tương tác của ASP.NET Core Blazor JavaScript (JS Interop).

                Một yếu tố được chuyển qua mã JS thông qua JS Interop. Mã JS nhận được một ví dụ
                • [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  07, nó có thể sử dụng với API DOM bình thường. Ví dụ: mã sau đây xác định phương thức mở rộng .NET (
                  [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  08) cho phép gửi chuột nhấp vào một phần tử.
                  @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  45
                • Hàm JS [script.js] function buttonClick() { // this function triggers on button click } 09 tạo ra một sự kiện @if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 97 trên phần tử HTML được thông qua ([script.js] function buttonClick() { // this function triggers on button click } 11):

                Để gọi hàm JS không trả về giá trị, hãy sử dụng jsruntimeExtensions.invokevoidasync. Mã sau đây kích hoạt sự kiện

                • @if (TempData["myMessage"] != null)
                  { 
                      
                  }
                  
                  97 phía máy khách bằng cách gọi chức năng JS trước đó với phần tử bị bắt:
                • Để sử dụng phương thức mở rộng, hãy tạo một phương thức mở rộng tĩnh để nhận cá thể ijsruntime:

                Thêm kiểu sau vào

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                60 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                233 (Blazor Webassugging) hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                234 (Máy chủ Blazor):
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                6

                Thêm tập lệnh sau đây bên trong Đóng

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                232 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                233 (Blazor Webassugging) hoặc
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                234 (Máy chủ Blazor):
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                7
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                21 (Thành phần cha mẹ):
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                8
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                22:
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                9

                Trong ví dụ trước, không gian tên của ứng dụng là

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                23 với các thành phần trong thư mục
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                25 (Thành phần con):
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                50
                [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }28:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                51

                Trong ví dụ trước, không gian tên của ứng dụng là

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                23 với các thành phần trong thư mục
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                25 (Thành phần con):
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                50
                [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }28:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                51

                [script.js] function buttonClick() { // this function triggers on button click } 23 với các thành phần được chia sẻ trong thư mục [script.js] function buttonClick() { // this function triggers on button click } 27. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên.

                Harden javascript interop cuộc gọi

                Phần này chủ yếu áp dụng cho các ứng dụng Blazor Server, nhưng các ứng dụng Webassugging của Blazor cũng có thể đặt thời gian chờ JS Interop nếu điều kiện đảm bảo nó.

                Trong các ứng dụng máy chủ Blazor, interop JavaScript (JS) có thể thất bại do lỗi kết nối mạng và nên được coi là không đáng tin cậy. Theo mặc định, các ứng dụng Blazor Server sử dụng thời gian chờ một phút cho các cuộc gọi interop của JS. Nếu một ứng dụng có thể chịu đựng được thời gian chờ tích cực hơn, hãy đặt thời gian chờ bằng một trong các phương pháp sau.

                Đặt thời gian chờ toàn cầu trong phương thức

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                955 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                956 với CircuitOptions.jsInteropDefaultCallTimeout:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                52

                Người giữ chỗ

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                29 là một khoảng thời gian (ví dụ:
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                30).

                2

                Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

                • Trong ví dụ trước:
                • [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  29 là một khoảng thời gian (ví dụ:
                  [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  30).

                Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                955 của
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                956 với CircuitOptions.jsInteropDefaultCallTimeout:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                52

                Người giữ chỗ

                [script.js] function buttonClick() { // this function triggers on button click } 29 là một khoảng thời gian (ví dụ: [script.js] function buttonClick() { // this function triggers on button click } 30).

                Đặt thời gian chờ mỗi khoảng thời gian trong mã thành phần. Thời gian chờ được chỉ định ghi đè lên thời gian chờ toàn cầu được đặt bởi JSInteropDefaultCallTimeout:

                • Trong ví dụ trước:
                • Người giữ chỗ
                  [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  29 là một khoảng thời gian (ví dụ:
                  [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  30).

                [script.js] function buttonClick() { // this function triggers on button click } 33 là định danh cho hàm gọi. Ví dụ: giá trị @if (TempData["myMessage"] != null) { } 08 gọi hàm @if (TempData["myMessage"] != null) { } 07.

                Mặc dù nguyên nhân phổ biến của các lỗi Interop JS là lỗi mạng trong các ứng dụng máy chủ blazor, thời gian chờ trên mỗi lần định vị có thể được đặt cho các cuộc gọi interop JS trong các ứng dụng WebAssugging của Blazor. Mặc dù không có mạch tín hiệu nào tồn tại trong một ứng dụng WebAssugging của Blazor, các cuộc gọi Interop của JS có thể thất bại vì những lý do khác áp dụng trong các ứng dụng Webassugging của Blazor.

                Để biết thêm thông tin về sự cạn kiệt tài nguyên, hãy xem Hướng dẫn giảm thiểu mối đe dọa cho máy chủ blazor ASP.NET Core.

                Tránh các tài liệu tham khảo đối tượng tròn

                Các đối tượng có chứa các tham chiếu tròn không thể được tuần tự hóa trên máy khách cho một trong hai:

                Phương thức .NET gọi.

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                55:
                9

                Error:

                Các cuộc gọi phương thức JavaScript từ C# khi loại trả về có tham chiếu tròn.

                Giới hạn kích thước trên các cuộc gọi interop JavaScript

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                59

                Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor. Trong Blazor Webassugging, khung không áp đặt giới hạn về kích thước của các đầu vào và đầu ra interop JavaScript (JS).

                Trong máy chủ Blazor, các cuộc gọi interop JS bị giới hạn kích thước bằng kích thước tin nhắn tín hiệu đến tối đa được phép cho các phương thức trung tâm, được thực thi bởi HubOptions.MaximumReceIvemessagesize (mặc định: 32 kb). Các thông báo JS đến .NET Signalr lớn hơn MaximumReceIvemessagesize ném lỗi. Khung không áp đặt giới hạn về kích thước của tin nhắn SignalR từ trung tâm đến máy khách.

                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                955:

                Khi ghi nhật ký tín hiệu không được đặt thành gỡ lỗi hoặc theo dõi, lỗi kích thước tin nhắn chỉ xuất hiện trong bảng điều khiển công cụ phát triển của trình duyệt:

                • Lỗi: Kết nối bị ngắt kết nối với lỗi 'Lỗi: Máy chủ đã trả về lỗi khi đóng: Kết nối đóng với lỗi.'.
                • Khi ghi nhật ký phía máy chủ Signalr được đặt thành gỡ lỗi hoặc theo dõi, việc ghi nhật ký phía máy chủ sẽ không hợp lệ cho lỗi kích thước tin nhắn.
                • System.io.invaliddataException: Kích thước tin nhắn tối đa là 32768b đã bị vượt quá. Kích thước tin nhắn có thể được cấu hình trong AddHubOptions.
                • Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong
                • Thực thi các yêu cầu bổ sung sau đây cho mục đích bảo mật:
                  • Khai báo tệp tối đa hoặc kích thước dữ liệu có thể được truyền.
                  • Khai báo tỷ lệ tải lên tối thiểu từ máy khách lên máy chủ.
                • Sau khi máy chủ nhận được dữ liệu, dữ liệu có thể là:
                  • Tạm thời được lưu trữ trong bộ đệm bộ nhớ cho đến khi tất cả các phân đoạn được thu thập.
                  • Tiêu thụ ngay lập tức. Ví dụ: dữ liệu có thể được lưu trữ ngay lập tức trong cơ sở dữ liệu hoặc được ghi vào đĩa khi nhận được mỗi phân đoạn.

                Bắt các ngoại lệ JavaScript

                Để bắt các ngoại lệ của JS, hãy kết thúc khối JS trong khối ________ 365 -____ ____ 366 và bắt một JSException.

                Trong ví dụ sau, hàm

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                67 JS không tồn tại. Khi chức năng không được tìm thấy, JSException bị mắc kẹt với một thông báo cho biết lỗi sau:
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                68
                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                69:
                @if (TempData["myMessage"] != null)
                { 
                    
                }
                
                63

                JavaScript interop gọi không có mạch

                Phần này chỉ áp dụng cho các ứng dụng máy chủ Blazor.

                Không thể phát hành các cuộc gọi interop JavaScript (JS) sau khi ngắt kết nối mạch tín hiệu. Nếu không có mạch trong quá trình xử lý thành phần hoặc bất cứ lúc nào đó không tồn tại mạch, phương thức sau đây sẽ không thành công và đăng nhập thông báo rằng mạch bị ngắt kết nối dưới dạng JSDisconnectedException:

                • Các cuộc gọi phương thức interop của JS
                  • IJSRuntime.InvokeAsync
                  • JSRuntimeExtensions.InvokeAsync
                  • JSRuntimeExtensions.InvokeVoidAsync)
                • ________ 384/________ 395 kêu gọi bất kỳ ijsobjectreeference nào.

                Để tránh ghi nhật ký jsdisconnectedException hoặc để đăng nhập thông tin tùy chỉnh, hãy nắm bắt ngoại lệ trong câu lệnh

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                96.

                Đối với ví dụ xử lý thành phần sau:

                • Các thành phần thực hiện IAnyncDisposable.
                • [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  97 là một ijsobjectreeference.
                • JSDisconnectedException bị bắt và không ghi lại.
                • Tùy chọn, bạn có thể đăng nhập thông tin tùy chỉnh trong câu lệnh
                  [script.js]
                  function buttonClick() {
                      // this function triggers on button click
                  }
                  
                  66 ở bất kỳ cấp độ nhật ký nào bạn thích. Ví dụ sau đây không đăng nhập thông tin tùy chỉnh vì nó giả sử nhà phát triển không quan tâm đến việc khi hoặc nơi các mạch bị ngắt kết nối trong quá trình xử lý thành phần.
                [index.razor]
                @page "/"
                @inject IJSRuntime jsRuntime
                
                
                
                @code {
                    protected void onbuttonclick (MouseEventArgs args)
                    {
                        await jsRuntime.InvokeVoidAsync("buttonClick ");
                    }
                }8

                Nếu bạn phải dọn sạch các đối tượng JS của riêng mình hoặc thực thi mã JS khác trên máy khách sau khi mất mạch, hãy sử dụng mẫu

                [script.js]
                function buttonClick() {
                    // this function triggers on button click
                }
                
                99 trong JS trên máy khách.

                Để biết thêm thông tin, hãy xem các bài viết sau:

                • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core: Phần interop JavaScript thảo luận về việc xử lý lỗi trong các kịch bản interop JS.
                • Vòng đời thành phần dao cạo ASP.NET Core: Phần xử lý thành phần với phần
                  00 và
                  01 mô tả cách thực hiện các mẫu xử lý trong các thành phần dao cạo.

                Tài nguyên bổ sung

                • Gọi .NET Phương thức từ các chức năng JavaScript trong Blazor ASP.NET Core
                • 02 Ví dụ (Kho lưu trữ GitHub của DOTNET/ASPNetCore
                  03): Chi nhánh
                  03 đại diện cho sự phát triển hiện tại của đơn vị sản phẩm cho bản phát hành tiếp theo của ASP.NET Core. Để chọn nhánh cho một bản phát hành khác (ví dụ:
                  05), hãy sử dụng danh sách thả xuống nhánh hoặc thẻ chuyển đổi để chọn nhánh.Switch branches or tags dropdown list to select the branch.Switch branches or tags dropdown list to select the branch.
                • Tải lên tệp blazor ASP.NET Core
                • Kho lưu trữ Github mẫu Blazor (
                  06)
                • Xử lý các lỗi trong các ứng dụng blazor ASP.NET Core (phần interop JavaScript)

                Nhận xét

                Gửi và xem phản hồi cho

                Tôi có thể sử dụng JavaScript trong các trang dao cạo không?

                Bạn có thể gọi các phương thức JavaScript từ các trang Blazor với sự trợ giúp của JavaScript interop bằng cách đưa ijsruntime phụ thuộc vào trang dao cạo. Sau đó giới thiệu tập lệnh trong trang HTML của ứng dụng Blazor. Kiểm tra liên kết này để biết thêm thông tin.. Then refer the script in the HTML page of the blazor application. Check this link for more information.. Then refer the script in the HTML page of the blazor application. Check this link for more information.

                Tôi có thể sử dụng JavaScript trong Blazor không?

                Một ứng dụng Blazor có thể gọi các hàm JavaScript (JS) từ các phương thức .NET và các phương thức .NET từ các hàm JS.Các kịch bản này được gọi là khả năng tương tác JavaScript (JS Interop).NET methods and .NET methods from JS functions. These scenarios are called JavaScript interoperability (JS interop). NET methods and . NET methods from JS functions. These scenarios are called JavaScript interoperability (JS interop).

                Làm thế nào để bạn gọi một tệp javascript trong blazor?

                Để gọi phương thức blazor, bạn sử dụng hàm invokemethodasync của đối tượng dotnet JavaScript.Bạn phải chuyển phương thức đó tên của lắp ráp giữ mã C# của bạn và tên của phương thức tĩnh "JavaScript không thể thêm" mà bạn muốn gọi (sau đó là "JavaScript-Invokable" sau).use the invokeMethodAsync function of the JavaScript DotNet object. You must pass that method the name of the assembly holding your C# code and the name of the "JavaScript-invokable" static method that you want to call (more on "JavaScript-invokable" later).use the invokeMethodAsync function of the JavaScript DotNet object. You must pass that method the name of the assembly holding your C# code and the name of the "JavaScript-invokable" static method that you want to call (more on "JavaScript-invokable" later).

                Làm thế nào để bạn gọi một chức năng trong trang Dao cạo?

                Các trang dao cạo có phương pháp xử lý là động từ http.Vì vậy, để gọi một phương thức từ trang của bạn, bạn cần phải đặt theo sau là động từ HTTP mà bạn muốn sau đó tên phương thức của bạn.Và theo quan điểm của bạn, chuyển tên cho người chơi ASP không có tiền tố onpost hoặc onget hoặc hậu tố async.put On followed by the http verb you want then your method name . And in your view pass the name to the asp-page-handler without the OnPost or OnGet prefix or Async suffix.put On followed by the http verb you want then your method name . And in your view pass the name to the asp-page-handler without the OnPost or OnGet prefix or Async suffix.