web-dev-qa-db-fra.com

Server Blazor - Motif 'code derrière': Oninitializedasync (): Aucune méthode appropriée trouvée à remplacer

J'ai une application Blazor (serveur) qui fonctionne parfaitement bien et qui adhère à toutes les règles définies par Microsoft.CodeAnalysis.FxCopAnalyzers et StyleCop.Analyzers.

Une page de rasoir fortement coupée est la suivante:

@inherits OwningComponentBase<MyService>
@inject IModalService ModalService
@inject IJSRuntime JSRuntime

// UI code

@code
{
    private readonly CancellationTokenSource TokenSource = new CancellationTokenSource();
    ElementReference myElementReferenceName;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        await this.myElementReferenceName.FocusAsync(this.JSRuntime);
    }

    protected override async Task OnInitializedAsync()
    {
        ....
    }

    public void Dispose()
    {
        this.TokenSource.Cancel();
    }

    protected void ShowModalEdit(object someObject)
    {
        .....
        Modal.Show<MyPage>("Edit", parameters);
    }
}

Note n ° 1: J'ai utilisé @inherits OwningComponentBase<MyService> Basé sur suggestion de Daniel Roth

Note n ° 2: J'utilise le composant modal de Chris Saintyy Composant

Cependant, lorsque j'essaie de déplacer tout le code de la @code {...} section à un "code derrière" classe partielle ("mypage.razor.cs"), puis je rencontre les erreurs suivantes ....

"Mypage" ne contient pas de définition pour "service" et aucune méthode d'extension accessible 'Service' acceptant .....

'Mypage.onafterrenderasync (bool)': pas de méthode appropriée trouvée à remplacer

'Mypage.onInitializeAsync ()': aucune méthode appropriée trouvée pour remplacer

Le type 'mypage' ne peut pas être utilisé comme paramètre de type 'T' dans le type générique ou la méthode 'imodalservice.show (chaîne, modalparameters, modaloptions)'. Il n'y a pas de conversion de référence implicite de "mypage" sur "Microsoft.aspnetcore.components.componentbase".

Suggestions?

7
DrGriff

Je suis tombé sur cette erreur lorsque j'ai utilisé une approche de classe partielle et j'essayais d'une identité d'échafaudage. J'ai changé en classe de base Aproach, il a été résolu.

la classe partielle que j'utilisais après ajout d'un composant dit à MyComponent, ajoutez une classe myComponent.Razor.cs pour une utilisation des services d'injection

[Injecter] services d'immeubles publics {obtenir; ensemble; }

pour approche de la classe de base

après avoir ajouté A Après ajout d'un composant, dites à MyComponent, ajoutez une classe myComponent.Razor.cs Modifiez le nom de la classe et faites-la hériter de ComponentBase MyComponentBase: ComponentBase

et placez ceci en haut de myComponent.Razor

@inherits MyComponentBase

Utilisez un mot-clé protégé pour rendre vos méthodes accessibles

2
DevCisse