@page "/" @inject IJSRuntime jsRuntime <h1>Hello, world!</h1> <h1>Text File Reader</h1> <div> Select a text file: <input type="file" id="fileInput" @onchange="@ReadFileContent" /> </div> <pre> @fileContent </pre> Welcome to your new app. @code{ private string fileContent { get; set; } public static object CreateDotNetObjectRefSyncObj = new object(); protected DotNetObjectRef<T> CreateDotNetObjectRef<T>(T value) where T : class { lock (CreateDotNetObjectRefSyncObj) { JSRuntime.SetCurrentJSRuntime(jsRuntime); return DotNetObjectRef.Create(value); } } public async Task ReadFileContent(UIChangeEventArgs ea) { // Fire & Forget: ConfigureAwait(false) is telling "I'm not expecting this call to return a thing" await jsRuntime.InvokeAsync<object>("readFileProxy", CreateDotNetObjectRef(this), "ReadFileCallback", ea.Value.ToString()).ConfigureAwait(false); } [JSInvokable] // This is required in order to JS be able to execute it public void ReadFileCallback(string response) { fileContent = response?.ToString(); StateHasChanged(); } }
namespace BlazorFiddleProject { using Microsoft.AspNetCore.Components.Builder; using Microsoft.Extensions.DependencyInjection; public class Startup { public void ConfigureServices(IServiceCollection services) { } public void Configure(IComponentsApplicationBuilder app) { app.AddComponent<App>("app"); } } }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width"> <title>BlazorFiddleProject</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <style> app { } </style> <script type="text/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); }); } </script> </head> <body> <app>Loading...</app> <script src="_framework/blazor.webassembly.js"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>

Add component

BlazorFiddle was updated from Blazor 0.7 to .NET 6.0. Your old source code could not work. You need to upgrade to latest.