Esencialmente, solo puedo pasar primitivos y tipos anónimos como argumento en la interoperabilidad de Blazor con JS.
Mi primera publicación sobre el desbordamiento de pila porque simplemente no puedo entender esto:
Este ejemplo funciona:
C#:
async void doThing() { await JSRuntime.InvokeAsync<object>("test", new { Name = "John", Age = 35 }); }JS:
var test = funciton(stuff){ console.log(stuff); return stuff; } Output in JS is object with name and age as expected.Ahora aquí está mi clase real:
public class CarsAndBikes { public car[] cars; public bike[] bikes; } async void doThing() { await JSRuntime.InvokeAsync<object>("test", carsAdnBikes); }No es tan complejo, pero lo que puedo ver en JS es un objeto vacío, a menos que lo serialice como JSON y lo deserialice. coche y moto son clases. C#
JsonConvert.SerializeObject(CarsAndBikes);JS:
JSON.parse(stuff)Entonces funciona bien. No tengo idea de por qué no puedo pasar mi clase a JS, ¿alguien sabe si estoy haciendo algo mal o es un error?
Aquí hay una demostración de trabajo simple usando su código. Funciona, por lo que hay algo que no nos muestra que rompe su código. ¿Cómo es Car and Bike ?
@page "/" @inject IJSRuntime Js <PageTitle>Index</PageTitle> <button class="btn btn-primary" @onclick=doThing>Object</button> <button class="btn btn-secondary" @onclick=doBookThing>Book as Object</button> <button class="btn btn-dark" @onclick=doBook>Book</button> <button class="btn btn-info" @onclick=doBooks>Books</button> @code { async void doThing() { await Js.InvokeAsync<object>("test", new { ID = 1, Title = "Fred" }); } async void doBookThing() { await Js.InvokeAsync<object>("test", new Book { ID = 1, Title = "Portugal" }); } async void doBook() { await Js.InvokeAsync<Book>("test", new Book { ID = 1, Title = "Shaun" }); } async void doBooks() { await Js.InvokeAsync<object>("test", new Catalog()); } public class Book { public int ID { get; set; } public string Title { get; set; } = string.Empty; } public class Catalog { public List<Book> Books { get; set; } = new List<Book> { new Book { ID=10, Title="Jon" }, new Book { ID=11, Title="Spain" } }; } }