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 JavaScript CallCalculateMultiplication, debes usar invokeMethodAsync 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 y no2 como argumentos al método CalculateMultiplication en la llamada a invokeMethodAsync.

    Con esto, cuando llames a JSRuntime.InvokeVoidAsync en tu componente de Blazor, deberías poder pasar los argumentos correctamente al método CalculateMultiplication:

    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étodo InvokeAsync<TValue> de JSRuntime 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