web-dev-qa-db-fra.com

Comment passer un paramètre au composant Razor dans Blazor côté serveur?

Comment puis-je passer le paramètre dans le composant de rasoir?

Jusqu'à présent, j'ai essayé

@(await Html.RenderComponentAsync<Rateplan>(RenderMode.ServerPrerendered, new { id= 100}))

Mais je reçois une erreur

InvalidOperationException: les composants de serveur de pré-rendu avec des paramètres ne sont pas pris en charge.

J'essaie la même chose avec RenderMode.ServerPrerendered mais je reçois une erreur

InvalidOperationException: les composants serveur avec paramètres ne sont pas pris en charge.

J'ai aussi essayé de faire

<Rateplan Id="100"></Rateplan>

mais cela n'a même pas démarré le composant.

9
mko

Dans le composant où vous souhaitez accepter le paramètre, vous devez avoir une propriété marquée comme paramètre

Comme

[Parameter]
public List<Player> Players { get; set; }

Ensuite, vous devriez pouvoir passer le paramètre comme

<Componentname param-Players="@players"></Componentname>

(Dans cet exemple, @players est une variable locale)

7
anders stubberup

Le problème et la solution de contournement sont décrits dans cet article . (Il y a un petit bogue, car GetModel devrait être nommé GetCustomerId) La transmission des paramètres n'est pas prise en charge, exactement comme le dit l'exception.

Vous pouvez attendre ASP.NET Core 3.1, où la capacité de passer des paramètres sera restaurée .

J'ai implémenté la solution du premier article pour le paramètre OperationId comme ceci - le code du composant rasoir:

using Microsoft.JSInterop;

[Inject]
protected IJSRuntime jrt { get; set; }

protected async override Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        try
        {
            var oid = await jrt.InvokeAsync<string>("GetOperationId");
            int opid;
            if (int.TryParse(oid, out opid))
                OperationId = opid;
        }
        catch (Exception ex)
        {
            ls?.LogException(ex, "Sortiment.OnAfterRenderAsync");
        }
        //This code was moved from OnInitializedAsync which executes without parameter value
        if (OperationId.HasValue)
            sortiment = await ProductService.GetSortimentAsync(null, OperationId, Odpady);
        else
            productFilter = await ProductService.GetProductFilterAsync();
        StateHasChanged(); //Necessary, because the StateHasChanged does not fire automatically here
    }
}

et l'a ajouté à la page d'hébergement Razor:

@section Header
{
  <script>
  function GetOperationId() {
    return "@Model.OperationId";
  }
  </script>
}

Cette solution de contournement ne fonctionne que pour RenderMode.Server.

2
Vojtěch Dohnal

Définir RenderMode comme statique

@(await Html.RenderComponentAsync<Rateplan>(RenderMode.Static, new { id = 100 }))
0
Alexey Belanov