Hướng dẫn how do i run javascript on a razor page? - làm cách nào để chạy javascript trên 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?

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]
{ 
    displayMessage[];
}

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:15

Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
26 thay vì thuộc tính chỉ thị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:


  window.displayTickerAlert1 = [symbol, price] => {
    alert[`${symbol}: $${price}!`];
  };

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
34 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
35:

@page "/call-js-example-2"
@inject IJSRuntime JS

Call JS Example 2

Set Stock

@if [stockSymbol is not null] {

@stockSymbol price: @price.ToString["c"]

} @code { private Random r = new[]; private string? stockSymbol; private decimal price; private async Task SetStock[] { stockSymbol = $"{[char]['A' + r.Next[0, 26]]}{[char]['A' + r.Next[0, 26]]}"; price = r.Next[1, 101]; await JS.InvokeVoidAsync["displayTickerAlert1", stockSymbol, price]; } }

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
38:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
0

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
41 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
42:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
49 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
50:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
53:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
4

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
56 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
57:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
58:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
59 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
63:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
66 chỉ được gọi khi
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
68 là
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
69.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
70:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    72
  • Tải tập lệnh từ tệp JavaScript bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    73]
  • 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

Không đặt thẻ

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

Sự cô lập JavaScript trong các mô -đun JavaScript

Blazor cho phép cách ly JavaScript [JS] trong các mô -đun JavaScript tiêu chuẩn [Đặc tả ECMAScript].

Sự cô lập JS cung cấp các lợi ích sau:

  • JS nhập khẩu không còn gây ô nhiễm không gian tên toàn cầu.
  • Người tiêu dùng của một thư viện và các thành phần không bắt buộc phải nhập các JS liên quan.

Ví dụ: mô -đun JS sau xuất, một hàm JS để hiển thị dấu nhắc cửa sổ trình duyệt. Đặt mã JS sau trong tệp JS bên ngoài.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
78:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
5

Thêm mô -đun JS trước đó vào một ứng dụng hoặc thư viện lớp dưới dạng tài sản web tĩnh trong thư mục

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
80:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
6

Trong ví dụ trước:

  • Theo quy ước, định danh
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    82, trong đó:
    • Đoạn đường dẫn cho thư mục hiện tại [
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      84 là đường dẫn và tên tệp theo
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
87:

  • Đoạn đường dẫn cho thư mục hiện tại [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79.
  • Trình giữ chỗ
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79. Trong ví dụ sau, tệp JS bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    95] được đặt trong thư mục
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79 của thư viện lớp.
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
97 hoặc
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         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]:

[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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]:

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 đượ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].

Đặ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:

2

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].
  • Đặ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
}
33 là định danh cho hàm gọi. Ví dụ: giá trị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
08 gọi hàm
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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.

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.

3

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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.

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

4

Ghi chú

Để tạo bản đồ Mapbox, hãy lấy mã thông báo truy cập từ Mapbox đăng nhập và cung cấp nó ở nơi

[script.js]
function buttonClick[] {
    // this function triggers on button click
}
41 xuất hiện trong mã sau.

5

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

6

Để sản xuất kiểu dáng chính xác, hãy thêm thẻ SheetSheet sau vào trang HTML máy chủ.

  • 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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    60 [vị trí của nội dung
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    60]:
  • Ví dụ trước tạo ra UI bản đồ tương tác. Người dùng:

Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
26 thay vì thuộc tính chỉ thị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:


  window.displayTickerAlert1 = [symbol, price] => {
    alert[`${symbol}: $${price}!`];
  };

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
34 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
35:

@page "/call-js-example-2"
@inject IJSRuntime JS

Call JS Example 2

Set Stock

@if [stockSymbol is not null] {

@stockSymbol price: @price.ToString["c"]

} @code { private Random r = new[]; private string? stockSymbol; private decimal price; private async Task SetStock[] { stockSymbol = $"{[char]['A' + r.Next[0, 26]]}{[char]['A' + r.Next[0, 26]]}"; price = r.Next[1, 101]; await JS.InvokeVoidAsync["displayTickerAlert1", stockSymbol, price]; } }

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
38:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
0

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
41 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
42:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
49 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
50:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
53:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
4

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
56 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
57:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
58:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
59 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
63:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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].

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
66 chỉ được gọi khi
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
68 là
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
69.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
70:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
3

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
66 chỉ được gọi khi
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
68 là
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
69.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
66 chỉ được gọi khi
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
68 là
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
69.

Đồ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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
78:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
80:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]:
  • Tải một tập lệnh trong đánh dấu
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    60 [thường không được khuyến nghị]
    • Đoạn đường dẫn cho thư mục hiện tại [
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      84 là đường dẫn và tên tệp theo
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
87:

  • Đoạn đường dẫn cho thư mục hiện tại [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    91 và tệp dự án của thư viện không chỉ định
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    90.
  • Trình giữ chỗ
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79. Trong ví dụ sau, tệp JS bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    95] được đặt trong thư mục
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79 của thư viện lớp.
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
97 hoặc
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         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]:

[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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]:

@page "/call-js-example-2"
@inject IJSRuntime JS

Call JS Example 2

Set Stock

@if [stockSymbol is not null] {

@stockSymbol price: @price.ToString["c"]

} @code { private Random r = new[]; private string? stockSymbol; private decimal price; private async Task SetStock[] { stockSymbol = $"{[char]['A' + r.Next[0, 26]]}{[char]['A' + r.Next[0, 26]]}"; price = r.Next[1, 101]; await JS.InvokeVoidAsync["displayTickerAlert1", stockSymbol, price]; } }
3

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

 Button  

@code {
    protected void onbutt title [MouseEventArgs args]
    {
        await jsRuntime.InvokeVoidAsync["buttonClick "];
    }
}
28:

@page "/call-js-example-2"
@inject IJSRuntime JS

Call JS Example 2

Set Stock

@if [stockSymbol is not null] {

@stockSymbol price: @price.ToString["c"]

} @code { private Random r = new[]; private string? stockSymbol; private decimal price; private async Task SetStock[] { stockSymbol = $"{[char]['A' + r.Next[0, 26]]}{[char]['A' + r.Next[0, 26]]}"; price = r.Next[1, 101]; await JS.InvokeVoidAsync["displayTickerAlert1", stockSymbol, price]; } }
4

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 đượ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].

Đặ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:

2

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].
  • Đặ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
}
33 là định danh cho hàm gọi. Ví dụ: giá trị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
08 gọi hàm
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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.

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.

3

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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.

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

4

Ghi chú

Để tạo bản đồ Mapbox, hãy lấy mã thông báo truy cập từ Mapbox đăng nhập và cung cấp nó ở nơi

[script.js]
function buttonClick[] {
    // this function triggers on button click
}
41 xuất hiện trong mã sau.

5

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

6

Để sản xuất kiểu dáng chính xác, hãy thêm thẻ SheetSheet sau vào trang HTML máy chủ.

  • 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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    60 [vị trí của nội dung
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    60]:
  • Ví dụ trước tạo ra UI bản đồ tương tác. Người dùng:

Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
26 thay vì thuộc tính chỉ thị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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ẻ


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [Máy chủ Blazor], cung cấp chức năng
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:


  window.displayTickerAlert1 = [symbol, price] => {
    alert[`${symbol}: $${price}!`];
  };

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
34 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
35:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
38:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
20

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
41 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
42:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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ẻ


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [blazor webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [máy chủ blazor], cung cấp chức năng
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
49 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
50:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
53:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
24

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
56 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
57:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
58:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
59 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
63:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
70:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    72
  • Tải tập lệnh từ tệp JS bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    73]
  • 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

Không đặt thẻ

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

Sự cô lập JavaScript trong các mô -đun JavaScript

Blazor cho phép cách ly JavaScript [JS] trong các mô -đun JavaScript tiêu chuẩn [Đặc tả ECMAScript].

Sự cô lập JS cung cấp các lợi ích sau:

  • JS nhập khẩu không còn gây ô nhiễm không gian tên toàn cầu.
  • Người tiêu dùng của một thư viện và các thành phần không bắt buộc phải nhập các JS liên quan.

Ví dụ: mô -đun JS sau xuất, một hàm JS để hiển thị dấu nhắc cửa sổ trình duyệt. Đặt mã JS sau trong tệp JS bên ngoài.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
78:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
5

Thêm mô -đun JS trước đó vào một ứng dụng hoặc thư viện lớp dưới dạng tài sản web tĩnh trong thư mục

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
80:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
36

Trong ví dụ trước:

  • Theo quy ước, định danh
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    82, trong đó:
    • Đoạn đường dẫn cho thư mục hiện tại [
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      84 là đường dẫn và tên tệp theo
      @if [TempData["myMessage"] != null]
      { 
          
               window.onload = function [] {
                   displayMessage[];
               };
          
      }
      
      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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
87:

  • Đoạn đường dẫn cho thư mục hiện tại [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
7

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
87:

Trình giữ chỗ

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
91 và tệp dự án của thư viện không chỉ định
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
90.

  • Trình giữ chỗ
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    84 là đường dẫn và tên tệp theo
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    79. Trong ví dụ sau, tệp JS bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    95] được đặt trong thư mục
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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ố

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
8

Cảnh báo

Không đặt thẻ

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
75 trong tệp thành phần [
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
30] vì thẻ
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         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]:

[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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
45

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ẹ.

Thêm kiểu sau vào

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [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


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [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]
{ 
    displayMessage[];
}
50

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

 Button  

@code {
    protected void onbutt title [MouseEventArgs args]
    {
        await jsRuntime.InvokeVoidAsync["buttonClick "];
    }
}
28:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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 đượ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

@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
55 của
@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
56 với CircuitOptions.jsInteropDefaultCallTimeout:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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:

2

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].
  • Đặ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
}
33 là định danh cho hàm gọi. Ví dụ: giá trị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
08 gọi hàm
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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ú

Để tạo bản đồ Mapbox, hãy lấy mã thông báo truy cập từ Mapbox đăng nhập và cung cấp nó ở nơi

[script.js]
function buttonClick[] {
    // this function triggers on button click
}
41 xuất hiện trong mã sau.

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

4

Để sản xuất kiểu dáng chính xác, hãy thêm thẻ SheetSheet sau vào trang HTML máy chủ.

Trong


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [máy chủ blazor], 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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60:

5

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

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
57

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.

Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } } 55:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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

@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
84, 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
    
     Button  
    
    @code {
        protected void onbutt title [MouseEventArgs args]
        {
            await jsRuntime.InvokeVoidAsync["buttonClick "];
        }
    }
    60. Hàm
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
     Button  
    
    @code {
        protected void onbutt title [MouseEventArgs args]
        {
            await jsRuntime.InvokeVoidAsync["buttonClick "];
        }
    }
    61 gọi
    [index.razor]
    @page "/"
    @inject IJSRuntime jsRuntime
    
     Button  
    
    @code {
        protected void onbutt title [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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
75 sau trong

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [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ẻ

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 đóng với
@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
92, trong đó trình giữ chỗ
@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
93 là đường dẫn và tên tệp của tập lệnh.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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

 Button  

@code {
    protected void onbutt title [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

 Button  

@code {
    protected void onbutt title [MouseEventArgs args]
    {
        await jsRuntime.InvokeVoidAsync["buttonClick "];
    }
}
64:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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

 Button  

@code {
    protected void onbutt title [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]
{ 
    displayMessage[];
}
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

 Button  

@code {
    protected void onbutt title [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

 Button  

@code {
    protected void onbutt title [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

 Button  

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

 Button  

@code {
    protected void onbutt title [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

 Button  

@code {
    protected void onbutt title [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ụ:

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]
{ 
    displayMessage[];
}
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

 Button  

@code {
    protected void onbutt title [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.
  • 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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    05] liên quan đến phạm vi toàn cầu [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    06]. Để gọi
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    07, định danh là
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    09 cho hàm JS.
  • Mã thông báo hủy bỏ [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    12 cũng phải có thể nối tiếp JSON.
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    14 được trả về cho các phương thức
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    15.
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    15 mở ra
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    14 và trả về giá trị được chờ đợi bởi
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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ẻ


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [Máy chủ Blazor]:


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

Thành phần

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
20 sau:

  • Gọi hàm
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    21 JS với InvokeAnync khi chọn nút [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    22].
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    23].

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
24:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
26 thay vì thuộc tính chỉ thị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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ẻ


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [Máy chủ Blazor], cung cấp chức năng
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
29 JS. Hàm được gọi với InvoKeVoidAsync và không trả về giá trị:


  window.displayTickerAlert1 = [symbol, price] => {
    alert[`${symbol}: $${price}!`];
  };

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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
34 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
35:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
38:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
20

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
33 trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
41 sau đây.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
42:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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ẻ


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [blazor webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [máy chủ blazor], cung cấp chức năng
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
44 JS. Ví dụ sau trả về một chuỗi để hiển thị bởi người gọi:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
49 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
50:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
53:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
24

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
32 gọi phương thức
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
48 và hiển thị chuỗi được trả về trong thành phần
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
56 sau.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
57:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
58:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
59 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với jsruntimeExtensions.invokevoidasync và không trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
63:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
64 được đặt bên trong phần tử
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60. Hàm được gọi với ijsruntime.invokeasync và trả về một giá trị.

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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].

Sự kiện vòng đời

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
70:

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    72
  • Tải tập lệnh từ tệp JS bên ngoài [
    @if [TempData["myMessage"] != null]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
75 trong tệp thành phần [
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
30] vì thẻ
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
97 hoặc
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
    { 
        
             window.onload = function [] {
                 displayMessage[];
             };
        
    }
    
    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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
8

Cảnh báo

Không đặt thẻ

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
75 trong tệp thành phần [
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
30] vì thẻ
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
97 hoặc
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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:

[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].

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

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]
{ 
    displayMessage[];
}
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]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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:
  • 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ẹ.

Thêm kiểu sau vào

@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
60 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [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


  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

32 của

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

33 [Blazor Webassugging] hoặc

  window.convertArray = [win1251Array] => {
    var win1251decoder = new TextDecoder['windows-1251'];
    var bytes = new Uint8Array[win1251Array];
    var decodedArray = win1251decoder.decode[bytes];
    console.log[decodedArray];
    return decodedArray;
  };

34 [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]
{ 
    displayMessage[];
}
50

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

 Button  

@code {
    protected void onbutt title [MouseEventArgs args]
    {
        await jsRuntime.InvokeVoidAsync["buttonClick "];
    }
}
28:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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 đượ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

@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
55 của
@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
56 với CircuitOptions.jsInteropDefaultCallTimeout:

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
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:

2

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].
  • Đặ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
}
33 là định danh cho hàm gọi. Ví dụ: giá trị
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
08 gọi hàm
@if [TempData["myMessage"] != null]
{ 
    
         window.onload = function [] {
             displayMessage[];
         };
    
}
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.

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

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:

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

9

Error:

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.

@if [TempData["myMessage"] != null]
{ 
    displayMessage[];
}
59

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

@page "/call-js-example-1"
@inject IJSRuntime JS

Call JS convertArray Function

Convert Array

@text

Quote ©2005 Universal Pictures: Serenity
David Krumholtz on IMDB

@code { private MarkupString text; private uint[] quoteArray = new uint[] { 60, 101, 109, 62, 67, 97, 110, 39, 116, 32, 115, 116, 111, 112, 32, 116, 104, 101, 32, 115, 105, 103, 110, 97, 108, 44, 32, 77, 97, 108, 46, 60, 47, 101, 109, 62, 32, 45, 32, 77, 114, 46, 32, 85, 110, 105, 118, 101, 114, 115, 101, 10, 10, }; private async Task ConvertArray[] { text = new[await JS.InvokeAsync["convertArray", quoteArray]]; } }
55:

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.

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]
{ 
    displayMessage[];
}
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

 Button  

@code {
    protected void onbutt title [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.
  • 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.

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].

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].

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.

Chủ Đề