Blazor JS interop incapaz de pasar argumentos al método C#
Estoy tratando de llamar a un método C# de JS en Blazor pero incapaz de pasar argumentos a él.
El código es el siguiente:
public async Task FindMultiplication()
{
await JSRuntime.InvokeVoidAsync("CallCalculateMultiplication", DotNetObjectReference.Create(this), 1, 2);
}
[JSInvokable]
public int CalculateMultiplication(int no1, int no2)
{
int multiplication = no1 * no2;
return multiplication;
}
JS:
function CallCalculateMultiplication(obj, no1, no2)
{
var valueR = obj.invokeMethodAsync("CalculateMultiplication", no1, no2);
}
El problema sucede como CalculateMultiplication
método de Blazor Component no se llama.
También he notado que si no paso ningún argumento a CalculateMultiplication
método entonces se llama. El siguiente cambio de código funciona:
[JSInvokable]
public int CalculateMultiplication()
{
//int multiplication = no1 * no2;
return 2;
}
function CallCalculateMultiplication(obj, no1, no2)
{
var valueR = obj.invokeMethodAsync("CalculateMultiplication");
}
¿Por qué es repugnante? He visto que esto solía funcionar en Blazor 3.1 como este vídeo de Youtube implementa lo mismo (ver después de las 10:00 horas), pero ahora no lo hace. Así que mi pregunta es cómo debería enviar el argumento para instantánear un componente de afeitar C# método?
Pregunta hecha hace 3 años, 4 meses, 24 días - Por techsavvypro
3 Respuestas:
-
Me enteré de que necesitaré analizar los valores del argumento para int al llamar el método C# con JavaScript. A continuación figura el código actualizado de la función JS:
function CallCalculateMultiplication(obj, no1, no2) { var valueR = obj.invokeMethodAsync("CalculateMultiplication", parseInt(no1), parseInt(no2)); valueR.then(function (result) { // Print the result of the promise alert(result.toString()); }); }
Además, el resultado es una promesa de JavaScript que debe tratarse como se muestra a continuación:
valueR.then(function (result) { // Print the result of the promise alert(result); });
Respondida el Dec 21, 2020 a las 09:20 - por codeglitch
Votos positivos: 0 | Votos negativos: 0 -
El problema radica en cómo estás pasando los argumentos desde JavaScript al método C
en tu componente de Blazor. Para solucionarlo, puedes hacer lo siguiente:
En tu método JavaScriptCallCalculateMultiplication
, debes usarinvokeMethodAsync
de la siguiente manera:javascript function CallCalculateMultiplication(obj, no1, no2) { var valueR = obj.invokeMethodAsync("CalculateMultiplication", no1, no2) .then(result => { // Manejar el resultado si es necesario console.log(result); }); }
El cambio principal aquí es que ahora estás pasando
no1
yno2
como argumentos al métodoCalculateMultiplication
en la llamada ainvokeMethodAsync
.Con esto, cuando llames a
JSRuntime.InvokeVoidAsync
en tu componente de Blazor, deberías poder pasar los argumentos correctamente al métodoCalculateMultiplication
:csharp public async Task FindMultiplication() { await JSRuntime.InvokeVoidAsync("CallCalculateMultiplication", DotNetObjectReference.Create(this), 1, 2); }
Con esto, el método
CalculateMultiplication
en tu componente de Blazor debería recibir los argumentos correctamente y devolver la multiplicación de ellos.Respondida el Dec 22, 2020 a las 09:20 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema surge debido a un cambio en la forma en que Blazor maneja la invocación de métodos desde JavaScript en Blazor 3.1 y versiones posteriores. En Blazor 3.1 y versiones anteriores, era posible pasar argumentos de tipo primitivo directamente a los métodos invocables de C
. Sin embargo, en Blazor 3.1 y versiones posteriores, es necesario utilizar objetos JSON serializados para pasar argumentos a los métodos invocables de C#.
Para resolver este problema, puedes utilizar el métodoInvokeAsync<TValue>
deJSRuntime
para pasar los argumentos serializados al método C. El siguiente código muestra cómo modificar tu código para pasar los argumentos correctamente:
Código C:
csharp public async Task FindMultiplication() { DotNetObjectReference
dotNetObjectReference = DotNetObjectReference.Create(this); object[] args = new object[] { 1, 2 }; await JSRuntime.InvokeAsync ("CallCalculateMultiplication", dotNetObjectReference, args); } Código JavaScript:
javascript function CallCalculateMultiplication(obj, args) { var no1 = args[0]; var no2 = args[1]; var valueR = obj.invokeMethodAsync("CalculateMultiplication", no1, no2); }
Además, asegúrate de haber actualizado tus paquetes de NuGet a las últimas versiones. El paquete
Microsoft.AspNetCore.Components.WebAssembly
debe tener una versión de 7.0 o superior.También puedes consultar la siguiente documentación oficial de Microsoft para obtener más información sobre la invocación de métodos desde JavaScript en Blazor:
Interoperabilidad de JavaScript InvokeAsync
Method Respondida el Dec 22, 2020 a las 09:29 - por Gemini
Votos positivos: 0 | Votos negativos: 0