Blazor University (43)JavaScript 互操作 —— 類型安全

原文鏈接:https://blazor-university.com/javascript-interop/calling-dotnet-from-javascript/type-safety/

類型安全

在從 JavaScript 調用 .NET[1] 部分中,您可能已經注意到我們的 JavaScript 的第 6 行在將隨機生成的數字傳遞給 .NET 之前調用了 toString()

var?BlazorUniversity?=?BlazorUniversity?||?{};
BlazorUniversity.startRandomGenerator?=?function(dotNetObject)?{setInterval(function?()?{let?text?=?Math.random()?*?1000;console.log("JS:?Generated?"?+?text);dotNetObject.invokeMethodAsync('AddText',?text.toString());},?1000);
};

盡管對象類型在 JavaScript 中是可以互換的,但是當它們被傳遞給我們的 .NET Invokable 方法時,它們就不是那么互換了。調用 .NET 時,請確保為要傳遞的變量選擇正確的 .NET 類型。

JavaScript 類型.NET 類型
booleanSystem.Boolean
stringSystem.String
numberSystem.Float / System.Decimal
DateSystem.DateTime 或 System.String

枚舉

JSInvokable .NET 方法的參數是枚舉時,JavaScript 應該傳遞枚舉的數值。下面的示例將使用值 TestEnum.SecondValue 調用我們的 .NET 方法。

public?enum?TestEnum
{FirstValue?=?100,SecondValue?=?200
};[JSInvokable("OurInvokableDotNetMethod")]
public?void?OurInvokableDotNetMethod(TestEnum?enumValue)
{
}

但是,如果我們用 [System.Text.Json.Serialization.JsonConverter] 裝飾我們的枚舉,我們可以讓我們的 JavaScript 改為傳遞字符串值。

[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter))]
public?enum?TestEnum
{FirstValue?=?100,SecondValue?=?200
};

現在調用 JavaScript 可以傳遞枚舉值的名稱或其數值。以下兩個調用是等效的。

dotNetObject.invokeMethodAsync('OurInvokableDotNetMethod',?'FirstValue');
dotNetObject.invokeMethodAsync('OurInvokableDotNetMethod',?200);

調用靜態 .NET 方法

除了在 .NET 對象實例上調用方法外,Blazor 還使我們能夠調用靜態方法。下一個示例將展示如何從 JavaScript 調用 .NET 并檢索 API 調用可能需要的特定設置,例如 Google Analytics

從服務器設置中讀取 JavaScript 設置的好處是,在部署過程中可以根據環境(開發/QA/生產)覆蓋這些值,而無需更改 JavaScript 文件。

源代碼[2]

  • 創建新的 Blazor 服務器端應用程序

  • 打開 /appsettings.json 文件并添加一個名為“JavaScript”的部分

{"Logging":?{"LogLevel":?{"Default":?"Information","Microsoft":?"Warning","Microsoft.Hosting.Lifetime":?"Information"}},"JavaScript":?{"SomeApiKey":??"123456789"},"AllowedHosts":?"*"
}
  • 接下來我們需要一個類來保存這個設置,創建一個名為 Configuration 的文件夾

  • 在該文件夾中,創建一個名為 JavaScriptSettings.cs 的文件

public?class?JavaScriptSettings
{public?string?SomeApiKey?{?get;?set;?}
}
  • 編輯 /Startup.cs 文件

  • 在該類的構造函數中,我們將使用注入的 IConfiguration 實例從 /appsettings.json 中獲取“JavaScript”部分并將其存儲在靜態引用中。

public?Startup(IConfiguration?configuration)
{Configuration?=?configuration;var?javaScriptSettings?=?configuration.GetSection("JavaScript").Get<JavaScriptSettings>();JavaScriptConfiguration.SetSettings(javaScriptSettings);
}
  • JavaScriptConfiguration 類還不存在,所以接下來我們將在 Configuration 文件夾中創建它。

public?static?class?JavaScriptConfiguration
{private?static?JavaScriptSettings?Settings;internal?static?void?SetSettings(JavaScriptSettings?settings){Settings?=?settings;}public?static?JavaScriptSettings?GetSettings()?=>?Settings;
}

現在我們的配置文件中有一些新設置,一個在 .NET 中表示這些設置的類,我們正在讀取這些值并將它們存儲在靜態引用中。接下來我們需要從 JavaScript 訪問它。

  • 編輯 /Pages/_Host.cshtml 文件并在現有 <script> 標記下添加以下內容

<script?src="~/scripts/CallingStaticDotNetMethods.js"></script>
  • 接下來,在 /wwwroot 文件夾下創建一個名為 scripts 的文件夾

  • 在該文件夾中,創建一個名為 CallingDotNetStaticMethods.js 的新文件并添加以下腳本

setTimeout(async?function?()?{const?settings?=?await?DotNet.invokeMethodAsync("CallingStaticDotNetMethods",?"GetSettings");alert('API?key:?'?+?settings.someApiKey);
},?1000);

DotNet.invokeMethodAsync 至少需要兩個參數。可以傳遞兩個以上,并且第二個之后的任何參數都被認為是作為參數傳遞給方法的值。

  1. 方法所在的二進制文件的全名(不包括文件擴展名)

  2. 要執行的方法的標識符

最后一塊拼圖是用 [JSInvokable] 屬性裝飾方法,傳入標識符——在本示例中,標識符將是 GetSettings

編輯 /Configuration/JavaScriptConfiguration 類,并更改 GetSettings 方法:

[JSInvokable("GetSettings")]
public?static?JavaScriptSettings?GetSettings()?=>?Settings;

傳遞給 [JSInvokable] 的標識符不必與方法名稱相同。

JavaScript 可調用方法的條件

要成為可通過這種方式調用的候選 .NET 方法,該方法必須滿足以下條件:

  • 擁有該方法的類必須是公共的 -方法必須是公開的

  • 必須是靜態方法

  • 返回類型必須為 void,或可序列化為 JSON——或者它必須是 TaskTask<T>,其中 T 可序列化為 JSON

  • 所有參數必須可序列化為 JSON

  • 該方法必須用 [JSInvokable] 裝飾

  • JSInvokable 屬性中使用的同一標識符不能在單個程序集中多次使用。

注意:不要立即從 JavaScript 調用 .NET 靜態方法

如果您回顧 JavaScript 啟動過程[3]部分,您會記得 JavaScript 在 Blazor 初始化之前已在瀏覽器中初始化。

6376e418620dd48f03454c92c2c0e65f.png

正是出于這個原因,我們只在初始超時后調用 .NET 靜態方法——在這種情況下,我選擇了一秒。

setTimeout(async?function?()?{const?settings?=?await?DotNet.invokeMethodAsync("CallingStaticDotNetMethods",?"GetSettings");alert('API?key:?'?+?settings.someApiKey);
},?1000);

在撰寫本文時,無法從 JavaScript 檢查 Blazor 是否已準備好被調用,而無需嘗試調用它并失敗。

window.someInitialization?=?async?function?()?{try?{const?settings?=?await?DotNet.invokeMethodAsync("CallingStaticDotNetMethods",?"GetSettings");alert('API?key:?'?+?settings.someApiKey);}catch?{//?Try?againthis.setTimeout(someInitialization,?10);}
}
window.someInitialization();

連接到 Blazor.start

可以在通過調用 Blazor.start 函數初始化 Blazor 時調用我們的 JavaScript。

首先,編輯 /Pages/_Host.cshtml 并更改引用 Blazor 腳本的 <script> 標記,并添加一個名為 autostart 且值為 false 的新屬性。

<script?src="_framework/blazor.server.js"?autostart="false"></script>

接下來,我們需要更改我們的 JavaScript 以便它調用 Blazor.start - 這將返回一個 Promise<void>,一旦 Blazor 初始化,我們就可以使用它來執行我們自己的代碼。

Blazor.start({}).then(async?function?()?{const?settings?=?await?DotNet.invokeMethodAsync("CallingStaticDotNetMethods",?"GetSettings");alert('API?key:?'?+?settings.someApiKey);});

這種方法的問題是您只能使用一次。因此,如果我們在不同的腳本中有多個入口點,那么我們將不得不創建自己的掛鉤點來緩存來自 Blazor.start 的結果并將其返回給任何調用腳本。

參考資料

[2]

源代碼: https://github.com/mrpmorris/blazor-university/tree/master/src/JavaScriptInterop/CallingStaticDotNetMethods

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分享 60 個神級 VS Code 插件

文章來源&#xff1a;juejin.cn/post/6994327298740600839 本文不做任何編輯器的比較&#xff0c;只是我本人日常使用 vscode 進行開發&#xff0c;并且比較喜歡折騰 vscode &#xff0c;會到處找這一些好玩的插件&#xff0c;于是越攢越多&#xff0c;今天給大家推薦一下我收…

URL結構分析

http://bh-lay.com/blog/14b531db64a

PHP 基礎篇 - PHP 中 DES 加解密詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、簡介 DES 是對稱性加密里面常見一種&#xff0c;全稱為 Data Encryption Standard&#xff0c;即數據加密標準&#xff0c;是一種使用密鑰加密的塊算法。密鑰長度是64位(bit)&#xff0c;超過位數密鑰被忽略。所謂對…

PerfView專題 (第一篇): 如何尋找熱點函數

一&#xff1a;背景 準備開個系列來聊一下 PerfView 這款工具&#xff0c;熟悉我的朋友都知道我喜歡用 WinDbg&#xff0c;這東西雖然很牛&#xff0c;但也不是萬能的&#xff0c;也有一些場景他解決不了或者很難解決&#xff0c;這時候借助一些其他的工具來輔助&#xff0c;是…

3四則運算軟件2016011992

使用JAVA編程語言&#xff0c;獨立完成一個3到5個運算符的四則運算練習的命令行軟件開發 基本功能要求&#xff1a; 程序可接收一個輸入參數n&#xff0c;然后隨機產生n道加減乘除&#xff08;分別使用符號-*來表示&#xff09;練習題&#xff0c;每個數字在 0 和 100 之間…

JAVA高并發多線程必須懂的50個問題

下面是Java線程相關的熱門面試題&#xff0c;你可以用它來好好準備面試。 1) 什么是線程&#xff1f; 線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位。程序員可以通過它進行多處理器編程&#xff0c;你可以使用…

Centos7設置IP為固定值

1.進入到系統的IP地址保存文件所在目錄 [rootlocalhost ~]# cd /etc/sysconfig/network-scripts 2.修改保存IP信息的文件 [rootlocalhost ~]# vim ifcfg-eth0 &#xff08;你機器上的名字有可能不是這個&#xff0c;但是是以ifcfg-eth開頭的文件&#xff09; 保存后退出 3.重啟…

為 EditorConfig 文件開啟錯誤編譯失敗

前言上次&#xff0c;我們介紹了 EditorConfig 文件可以自定義代碼樣式規則。但是&#xff0c;當我們想設置代碼樣式嚴重性&#xff0c;比如不允許編譯成功時&#xff0c;又踩了不少坑。修改無效想把 var 首選項&#xff0c;從“首選"var" 僅重構”&#xff0c;改成“…

【.NET特供-第三季】ASP.NET MVC系列:傳統WebForm站點和MVC站點執行機制對照

本文以圖形化的方式&#xff0c;從‘執行機制’方面對照傳統WebForm站點和MVC站點。請參看下面圖形&#xff1a; 一、執行機制 當我們訪問一個站點的時候&#xff0c;瀏覽器和server都是做了哪些動作呢&#xff1f; &#xff08;本文僅僅是提供一個簡單的執行過程&#xff0c;有…

hdoj1045 Fire Net(二分圖最大匹配)

題意&#xff1a;給出一個圖&#xff0c;其中有 . 和 X 兩種&#xff0c;. 為通路&#xff0c;X表示墻&#xff0c;在其中放炸彈&#xff0c;然后炸彈不能穿過墻&#xff0c;問你最多在圖中可以放多少個炸彈&#xff1f; 這個題建圖有點復雜orz。 建圖&#xff0c;首先把每一行…

c++的命名空間

一.C的命名原則namespace是指標識符的各種可見范圍&#xff0c;c的所有標識符都被定義在一個名為std的namespace中。1.<iostream>和<iostream.h>是兩個不同的文件&#xff0c;后綴為.h的頭文件c標準已經明確提出不支持了&#xff0c;早些的實現將標準庫功能定義在全…

投阿里被拒,說跳槽太頻繁!三年兩個工作,問題真的那么大嗎?

什么樣的跳槽頻率才不算頻繁&#xff1f;一位網友發問&#xff1a;投阿里被拒&#xff0c;理由是跳槽太頻繁&#xff0c;不合適。三年兩個工作&#xff0c;問題真的那么大嗎&#xff1f;網友說&#xff0c;阿里對穩定性要求非常高&#xff0c;三年兩跳和五年三跳都是紅線&#…

Linux下防御DDOS攻擊的操作梳理

DDOS的全稱是Distributed Denial of Service&#xff0c;即"分布式拒絕服務攻擊"&#xff0c;是指擊者利用大量“肉雞”對攻擊目標發動大量的正常或非正常請求、耗盡目標主機資源或網絡資源&#xff0c;從而使被攻擊的主機不能為合法用戶提供服務。 DDOS攻擊的本質是…

為什么信息化 ≠ 數字化?終于有人講明白了

作者&#xff1a;石秀峰 來源&#xff1a;談數據&#xff08;ID&#xff1a;learning-bigdata&#xff09; 近期&#xff0c;我一做數字化咨詢的朋友&#xff08;化名老王&#xff09;遇到了一個頭痛的問題&#xff1a;話說老王的團隊近期接了一個大單——一大型制造業的數字化…

JAVA代碼—算法基礎:數獨問題(Sodoku Puzzles)

JAVA代碼—算法基礎&#xff1a;數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨問題&#xff08;Sodoku Puzzles&#xff09; 數獨游戲&#xff08;日語&#xff1a;數獨 すうどく&#xff09;是一種源自18世紀末的瑞士的游戲&#xff0c;后在美國發展、并在日本得以發揚…

Linux系統恢復

實驗目的&#xff1a;熟悉了前面的啟動流程&#xff0c;系統的一個大致的啟動流程是怎樣的&#xff0c;而其中牽扯到了些許文件&#xff0c;這些文件在系統啟動時用于銜接各個步驟&#xff0c;如果這些文件損壞或缺失&#xff0c;系統將不能正常啟動&#xff0c;這次寫的內容就…

PerfView專題 (第二篇):如何尋找 C# 中的 Heap堆內存泄漏

一&#xff1a;背景 上一篇我們聊到了如何去找 熱點函數&#xff0c;這一篇我們來看下當你的程序出現了 非托管內存泄漏 時如何去尋找可疑的代碼源頭&#xff0c;其實思路很簡單&#xff0c;就是在 HeapAlloc 或者 VirtualAlloc 時做 Hook 攔截&#xff0c;記錄它的調用棧以及分…

關于 extern C的說明

在用C的項目源碼中&#xff0c;經常會不可避免的會看到下面的代碼 1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 /*...*/ 6 7 #ifdef __cplusplus 8 } 9 #endif 它到底有什么用呢&#xff0c;你知道嗎&#xff1f;而且這樣的問題經常會出現在面試or筆試…

Nginx 面試 40 問

Nginx是一款輕量級的Web服務器、反向代理服務器&#xff0c;由于它的內存占用少&#xff0c;啟動極快&#xff0c;高并發能力強&#xff0c;在互聯網項目中廣泛應用。 那么關于 Nginx 的核心技術點有哪些呢&#xff1f; 什么是Nginx&#xff1f; Nginx是一個 輕量級/高性能的…

用Cocos2dx開發棋牌游戲的觀點解析

眾所周知&#xff0c;目前棋牌游戲特別的火。很多游戲公司都想在這一塊賺錢&#xff0c;可是卻不知用什么軟件比較好的去開發棋牌游戲&#xff0c;對此&#xff0c;我列出了兩款比較靠譜的軟件去開發棋牌游戲&#xff0c;希望對大家有幫助&#xff01; 第一款軟件是cocos2dx,它…