ОБНОВЛЕНИЕ 1:
Перечитав ваш вопрос, я думаю, что это охватит ваш второй пример
Я думаю, у вас есть возможность реализовать прокси-функцию JS, которая обрабатывает вызов. Примерно так:
ОБНОВЛЕНИЕ 2:
Код обновлен функциональной (но не проверенной) версией, рабочий пример также можно найти в blazorfiddle.com
КОД JAVASCRIPT
// Target Javascript function
window.readFile = function (filePath, callBack) {
var fileInput = document.getElementById('fileInput');
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function (evt) {
callBack(evt.target.result);
};
reader.readAsText(file);
}
// Proxy function
// blazorInstance: A reference to the actual C# class instance, required to invoke C# methods inside it
// blazorCallbackName: parameter that will get the name of the C# method used as callback
window.readFileProxy = (instance, callbackMethod, fileName) => {
// Execute function that will do the actual job
window.readFile(fileName, result => {
// Invoke the C# callback method passing the result as parameter
instance.invokeMethodAsync(callbackMethod, result);
});
}
C # CODE
<code>@page "/"
@inject IJSRuntime jsRuntime
<div>
Select a text file:
<input type="file" id="fileInput" @onchange="@ReadFileContent" />
</div>
<pre>
@fileContent
Добро пожаловать в ваше новое приложение.
@код{
приватная строка fileContent {get; задавать; }
открытый статический объект CreateDotNetObjectRefSyncObj = new object ();
публичная асинхронная задача ReadFileContent (UIChangeEventArgs ea)
{
// Fire & Forget: ConfigureAwait (false) говорит: «Я не ожидаю, что этот вызов вернет вещь»
await jsRuntime.InvokeAsync («readFileProxy», CreateDotNetObjectRef (this), «ReadFileCallback», ea.Value.ToString ()). ConfigureAwait (false);
}
[JSInvokable] // Это необходимо для того, чтобы JS мог его выполнить
public void ReadFileCallback (ответ на строку)
{
fileContent = response? .ToString ();
StateHasChanged ();
}
// Взломать, чтобы исправить
https://github.com/aspnet/AspNetCore/issues/11159
защищенный DotNetObjectRef CreateDotNetObjectRef (значение T) где T: класс
{
блокировка (CreateDotNetObjectRefSyncObj)
{
JSRuntime.SetCurrentJSRuntime (jsRuntime);
return DotNetObjectRef.Create (значение);
}
}
}