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
Lúc đầu tôi đã thử
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ử.
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 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 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:
Đã 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.
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. 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
Trong bài viết nàyBà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:
Đối với các phương thức .NET trước đó gọi các hàm JS:
Đố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 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ị. 2Thành phần 20 sau:
24: 9API JavaScript giới hạn trong cử chỉ người dùngPhầ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 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 26 thay vì thuộc tính chỉ thị 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:
Cung cấp chức năng 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 9Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 0 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 1Gọ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 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 9Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 0 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 1Gọ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). 58: 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) { } 2Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 49 sau. 50: 3Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 53: 4 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 56 sau. 57: 5Kị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: 9Thà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 64 được đặt bên trong phần tử 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị. 0Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 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ì 66 chỉ được gọi khi 68 là 69. 70: 1Ghi 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: 2Đồng bộ JS Interop trong các ứng dụng Webassugging của BlazorPhầ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: 3Khi 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 đó: 4Vị trí của JavaScriptTả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):
Để 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) { } 1Ghi 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.
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. 78: 5Nế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 đó: 80: 6Trong ví dụ trước:
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. 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ó: 87:
7Nhậ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ỗ 84 là đường dẫn và tên tệp theo 79. Trong ví dụ sau, tệp JS bên ngoài ( 95) được đặt trong thư mục 79 của thư viện lớp.
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ư 97 hoặc 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 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 99.Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử 01 02: 8Cảnh báoChỉ 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ự ( 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 ( 04) từ đối tượng 05: 9Nếu JS interop làm biến đổi nội dung của phần tử 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ụ 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 ( 08) cho phép gửi chuột nhấp vào một phần tử. 2Hàm JS 09 tạo ra một sự kiện 97 trên phần tử HTML được thông qua ( 11): 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 4 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: 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 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 08 có sẵn từ không gian tên 15: 3
16 là định danh hàm JS. 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 17 có sẵn từ không gian tên 15: 5
6 7 21 (Thành phần cha mẹ): 8 22: 9Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 0Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 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 28 với CircuitOptions.jsInteropDefaultCallTimeout: 1Người giữ chỗ 29 là một khoảng thời gian (ví dụ: 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:
Đặ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: 28 với CircuitOptions.jsInteropDefaultCallTimeout: 1Ngườ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:
[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 3Cá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 42: 4 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 37 khi 38 là 39, tương tác với 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ở.
Trong ví dụ trước:
Hỗ trợ mảng byteBlazor 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 53 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 7 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 JavaScriptPhầ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:
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. 55: 9Error:
Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong 28. Ví dụ sau đây đặt kích thước tin nhắn nhận tối đa thành 64 kb: 0Việ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:
Phát trực tuyến từ .NET đến JavaScriptBlazor 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:
Trong JavaScript, sử dụng bộ đệm mảng hoặc luồng có thể đọc được để nhận dữ liệu:
Trong mã C#: 3Trong ví dụ trước:
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 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:68 69: 4Hủy bỏ một chức năng JavaScript chạy dàiSử 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 70 sau đây chứa một chức năng chạy dài mô phỏng, 71, để đếm liên tục cho đến khi 72 chỉ ra rằng 73 đã được gọi. Hàm 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 75, 71 được báo hiệu hủy bỏ thông qua kiểm tra có điều kiện vòng lặp 77 trên 78. 5Thành phần 79 sau:
85: 6Bả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 81 được chọn và khi chức năng bị hủy bỏ sau khi nút 83 được chọn: 81 button is selected and when the function is aborted after the 83 button is selected: 7 81 button is selected
and when the function is aborted after the 83 button is selected: 7JavaScript ________ 388/________ 389 InteropPhầ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 interopPhầ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 interopInterop 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
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.
8JSDisconnectedException 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 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.
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.
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)
Đối với các phương thức .NET trước đó gọi các hàm JS:
Đố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 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ị. 2Thành phần 20 sau:
24: 9API JavaScript giới hạn trong cử chỉ người dùngPhầ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 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 26 thay vì thuộc tính chỉ thị 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:
Cung cấp chức năng 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 9Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 0 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 1Gọ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 44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi: 2Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 49 sau. 50: 3Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 53: 4 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 56 sau. 57: 5Kị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 58: 6PrerenderingPhầ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 59 được đặt bên trong phần tử 60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị. 7Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 63: 8Ghi 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: 9Thà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 59 được đặt bên trong phần tử 60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị. 7Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 63: 8Ghi 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: 2Thà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 64 được đặt bên trong phần tử 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ị. 3 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ì 66 chỉ được gọi khi 68 là 69. 4Đồng bộ JS Interop trong các ứng dụng Webassugging của BlazorPhần này chỉ áp dụng cho các ứng dụng Webassugging của Blazor.
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ị. 3 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ì 66 chỉ được gọi khi 68 là 69. 4Đồng bộ JS Interop trong các ứng dụng Webassugging của Blazor
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ả. 78: 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 đó: 80: 6Vị trí của JavaScript
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. 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ó: 87:
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ư 97 hoặc 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:
Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử 01 02: 8Cả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ự ( 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 ( 04) từ đối tượng 05: 9Nếu JS interop làm biến đổi nội dung của phần tử 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ụ 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 ( 08) cho phép gửi chuột nhấp vào một phần tử.Hàm JS 09 tạo ra một sự kiện 97 trên phần tử HTML được thông qua ( 11): 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 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: 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: 2Phương thức 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 08 có sẵn từ không gian tên 15: 3Khi làm việc với các loại chung và trả về một giá trị, hãy sử dụng Valuetask: 4Trình giữ chỗ 16 là định danh hàm JS. 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 17 có sẵn từ không gian tên 15: 5Các yếu tố tham chiếu trên các thành phầnMột yếu tố không thể được truyền giữa các thành phần bởi vì:
Đố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ể:
6 7 21 (Thành phần cha mẹ): 8 22: 9Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 923 28: 94Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 923 28: 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 28 với CircuitOptions.jsInteropDefaultCallTimeout: 1Người giữ chỗ 29 là một khoảng thời gian (ví dụ: 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:
Đặ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: 28 với CircuitOptions.jsInteropDefaultCallTimeout: 1Ngườ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:
[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 3Cá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 42: 4 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 37 khi 38 là 39, tương tác với 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ở.
Đặ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:
Hỗ trợ mảng byteBlazor 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 53 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 7 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 JavaScriptPhầ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:
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. 55: 9Error:
Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong 28. Ví dụ sau đây đặt kích thước tin nhắn nhận tối đa thành 64 kb: 0Việ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:
JavaScript interopCá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:
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:
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. 05Cảnh báo Tên chức năng, hành vi và sự tồn tại của 63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:
64: 06Nế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 65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS: 07Cá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 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 ( 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 ( 68) và đặt giá trị của nó ( 69).Cảnh báo Tên chức năng, hành vi và sự tồn tại của 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 65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS: 07
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 ( 68) và đặt giá trị của nó ( 69).
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 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 ( 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 ( 68) và đặt giá trị của nó ( 69).
Phát trực tuyến từ .NET đến JavaScript 61:Phát trực tuyến từ .NET đến JavaScript 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: 3 57: Luồng được gửi đến JavaScript. 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, 58 mặc định là 60.68 69: 4Trong 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#: 5Trong ví dụ trước:
85: 6Sử 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#. 7881 button is selected and when the function is aborted after the 83 button is selected:81 button is selected and when the function is aborted after the 83
button is selected: 7Lớ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 79 sau:Gọi hàm JS 71 khi nút 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 75 khi hủyStokensource.Token bị hủy.
Để 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 96.Đối với ví dụ xử lý thành phần sau:
8Nế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 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:
Tài nguyên bổ sung
Để 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:
Đối với các phương thức .NET trước đó gọi các hàm JS:
Đố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 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ẻ 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 2Thành phần 20 sau:
24: 9API JavaScript giới hạn trong cử chỉ người dùngPhầ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 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 26 thay vì thuộc tính chỉ thị 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:
Bên trong thẻ 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor), cung cấp chức năng 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 19Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 20 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 21Gọ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ẻ 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor), cung cấp chức năng 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 19Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 20 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 21Gọ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. 58: 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) { } 2Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 49 sau. 50: 23Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 53: 24 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 56 sau. 57: 25Kị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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 63: 8Ghi 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: 9Thà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 64 được đặt bên trong phần tử 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị. 0Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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ú 70: 1Ghi 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: 2Thà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 64 được đặt bên trong phần tử 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị. 0Cả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). 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 3 64 được đặt bên trong phần tử 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị. 4Trong 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ả.
Tải một tập lệnh trong đánh dấu 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). 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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ả.
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 60 (thường không được khuyến nghị) 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. 80: 36Trong ví dụ trước:
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. 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ó: 87:
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ó: 87: 7 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ỗ
Để 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). 8Nắ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ẻ 75 trong tệp thành phần ( 30) vì thẻ 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ự ( 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 ( 04) từ đối tượng 05: 9Nếu JS interop làm biến đổi nội dung của phần tử 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ụ 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 ( 08) cho phép gửi chuột nhấp vào một phần tử.Hàm JS 09 tạo ra một sự kiện 97 trên phần tử HTML được thông qua ( 11): 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 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: 1 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 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 08 có sẵn từ không gian tên 15: 3 4 7 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ỗ 84 là đường dẫn và tên tệp theo 79. Trong ví dụ sau, tệp JS bên ngoài ( 95) được đặt trong thư mục 79 của thư viện lớp.
Đố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ể:
Thêm kiểu sau vào 60 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 6Thêm tập lệnh sau đây bên trong Đóng 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 7 21 (Thành phần cha mẹ): 8 22: 9Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 50 28: 51Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 50 28: 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 955 của 956 với CircuitOptions.jsInteropDefaultCallTimeout: 52Người giữ chỗ 29 là một khoảng thời gian (ví dụ: 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:
Đặ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: 955 của 956 với CircuitOptions.jsInteropDefaultCallTimeout: 52Ngườ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:
[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 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 37 khi 38 là 39, tương tác với 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. 3Hã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:
Trong ví dụ trước:
Giới hạn kích thước trên các cuộc gọi interop JavaScriptPhầ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:
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. 55: 9Error:
Tăng giới hạn bằng cách đặt MaximumReceIvemessagesize trong 955: 59Việ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 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:
JavaScript interopCá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:
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:
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 75 sau trong 233 (Blazor Webassugging) hoặc 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ẻ 232 đóng với 992, trong đó trình giữ chỗ 993 là đường dẫn và tên tệp của tập lệnh. 05Cảnh báo Tên chức năng, hành vi và sự tồn tại của 63 có thể thay đổi trong việc phát hành .NET trong tương lai. Ví dụ:
64: 61Nế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 65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS: 07Cá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 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 ( 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 ( 68) và đặt giá trị của nó ( 69).Cảnh báo Tên chức năng, hành vi và sự tồn tại của 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 65 sau đây xử lý tham chiếu đối tượng khi được gọi từ JS: 0768 69: 63Cá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 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 ( 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 (
Trong ví dụ sau, hàm 96. 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:
8JSRuntimeExtensions.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
Tài nguyên bổ sung
Để 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:
Đối với các phương thức .NET trước đó gọi các hàm JS:
Đố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 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ẻ 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 2Thành phần 20 sau:
24: 66API JavaScript giới hạn trong cử chỉ người dùngPhầ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 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 26 thay vì thuộc tính chỉ thị 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:
Bên trong thẻ 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor), cung cấp chức năng 29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị: 4Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 32 gọi phương thức 33 trong thành phần 34 sau đây. 35: 68Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 28) 38: 20 32 gọi phương thức 33 trong thành phần 41 sau đây. 42: 70Gọ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ẻ 232 của 233 (blazor webassugging) hoặc 234 (máy chủ blazor), cung cấp chức năng 44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi: 2Ví dụ về thành phần (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 30) (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 49 sau. 50: 72Lớp (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 36) Ví dụ (@if (TempData["myMessage"] != null) { window.onload = function () { displayMessage(); }; } 15) 53: 24 32 gọi phương thức 48 và hiển thị chuỗi được trả về trong thành phần 56 sau. 57: 74Kị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 58: 6PrerenderingPhầ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 59 được đặt bên trong phần tử 60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị. 7Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 63: 8Ghi 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: 9Thà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 59 được đặt bên trong phần tử 60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị. 7Cả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 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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. 63: 8Ghi chú 70: 1Ghi 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: 2Thà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. 64 được đặt bên trong phần tử 60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị. 0 61 không được gọi trong quá trình PRERENDERING trên máy chủ. Ghi đè phương thức 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: 3Khi 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 đó: 4Vị trí của JavaScriptTả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 Không đặt thẻ 75 trong tệp thành phần ( 30) vì thẻ 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ư 97 hoặc 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:
Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử 01 02: 8Cảnh báo Không đặt thẻ 75 trong tệp thành phần ( 30) vì thẻ 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ố 9Mộ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ư 97 hoặc 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 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 99.Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử 99. 0Ví dụ sau đây cho thấy việc bắt giữ một tham chiếu đến phần tử 01 02: 8Thêm thuộc tính 2 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 01 02: 1Chỉ 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ự ( 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 ( 04) từ đối tượng 05: 3Nế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ụ
Để 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
Thêm kiểu sau vào 60 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 6Thêm tập lệnh sau đây bên trong Đóng 232 của 233 (Blazor Webassugging) hoặc 234 (Máy chủ Blazor): 7 21 (Thành phần cha mẹ): 8 22: 9Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 50 28: 51Trong ví dụ trước, không gian tên của ứng dụng là 23 với các thành phần trong thư mục 24. Nếu kiểm tra mã cục bộ, hãy cập nhật không gian tên. 25 (Thành phần con): 50 28: 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 955 của 956 với CircuitOptions.jsInteropDefaultCallTimeout: 52Người giữ chỗ 29 là một khoảng thời gian (ví dụ: 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:
Đặ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: 955 của 956 với CircuitOptions.jsInteropDefaultCallTimeout: 52Ngườ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:
[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
Phương thức .NET gọi. 55: 9Error:
Giới hạn kích thước trên các cuộc gọi interop JavaScript 59Phầ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. 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:
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 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:68 69: 63JavaScript interop gọi không có mạchPhầ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:
Để 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 96.Đối với ví dụ xử lý thành phần sau:
8Nế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 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:
Tài nguyên bổ sung
Nhận xétGử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. |