Blazor服务器-“代码隐藏”模式:OnInitializedAsync():找不到合适的方法来覆盖

时间:2019-11-26 12:43:06

标签: code-behind blazor blazor-server-side

我有一个Blazor(服务器)应用程序,该应用程序运行良好,并且遵守Microsoft.CodeAnalysis.FxCopAnalyzersStyleCop.Analyzers设置的所有规则。

一个严重削减的剃须刀页面如下:

@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);
    }
}

注意#1:我基于Daniel Roth's suggestion使用了@inherits OwningComponentBase<MyService>

注意#2:我正在使用Chris Sainty's Modal component组件

但是,当我尝试将所有代码从@code {...}部分移到“背后的代码”子类(“ MyPage.razor.cs”)时,我遇到了以下错误。

  

“ MyPage”不包含“服务”的定义且不可访问   扩展方法“服务”接受.....

     

'MyPage.OnAfterRenderAsync(bool)':找不到合适的方法来覆盖

     

'MyPage.OnInitializedAsync()':找不到合适的方法来覆盖

     

类型'MyPage'不能用作泛型中的类型参数'T'   类型或方法'IModalService.Show(string,ModalParameters,   ModalOptions)”。没有来自的隐式引用转换   “ MyPage”到“ Microsoft.AspNetCore.Components.ComponentBase”。

建议?

3 个答案:

答案 0 :(得分:2)

当我使用部分类方法并且尝试设置Identity时,遇到此错误。我改用基类解决了。

我正在使用的

部分课程 在添加一个组件(例如MyComponent)之后,添加一个类MyComponent.razor.cs 用于注射服务 使用

[注入] 公共建筑服务服务{组; }

用于基类方法

在添加一个组件后添加一个例如MyComponent之后,添加一个类MyComponent.razor.cs 更改类名并使其继承于componentBase MyComponentBase:ComponentBase

并将其放在MyComponent.razor的顶部

@inherits MyComponentBase

使用受保护的关键字使您的方法可访问

答案 1 :(得分:0)

您的MyPage.razor.cs应该继承自ComponentBase类,而您的Mypage.razor应该继承自MyPage.razor.cs

在“代码隐藏”类中,应为要注入的每个服务使用[Inject]属性,并使其至少具有protected属性,以便能够在剃须刀组件中使用它们。

下面是我的一个测试应用程序中的一个示例,请注意,它使用.net-core 3.0,在3.1中可以使用部分类。

Index.razor

@page "/"
@inherits IndexViewModel

<div class="row">
    <div class="col-md">

        @if (users == null)
        {
            <p><em>Hang on while we are getting data...</em></p>
        }
        else
        {
            <table class="table">
                <thead>
                    <tr>
                        <th class="text-danger">Id</th>
                        <th class="text-danger">Username</th>
                        <th class="text-danger">Email</th>
                        <th class="text-danger">FirstName</th>
                        <th class="text-danger">LastName</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var user in users)
                    {
                        <tr>
                            <td>@user.Id</td>
                            <td>@user.Username</td>
                            <td>@user.Email</td>
                            <td>@user.FirstName</td>
                            <td>@user.LastName</td>
                        </tr>
                    }
                </tbody>
            </table>
        }
    </div>
</div>

IndexViewModel.cs

public class IndexViewModel : ComponentBase, IDisposable
{
    #region Private Members
    private readonly CancellationTokenSource cts = new CancellationTokenSource();
    private bool disposedValue = false; // To detect redundant calls

    [Inject]
    private IToastService ToastService { get; set; }
    #endregion

    #region Protected Members
    protected List<User> users;

    [Inject] IUsersService UsersService { get; set; }

    protected string ErrorMessage { get; set; }

    #endregion

    #region Constructor

    public IndexViewModel()
    {
        users = new List<User>();
    }

    #endregion

    #region Public Methods


    #endregion

    #region Private Methods

    protected override async Task OnInitializedAsync()
    {
        await GetUsers().ConfigureAwait(false);
    }

    private async Task GetUsers()
    {
        try
        {
            await foreach (var user in UsersService.GetAllUsers(cts.Token))
            {
                users.Add(user);
                StateHasChanged();
            }
        }
        catch (OperationCanceledException)
        {
            ShowErrorMessage($"{ nameof(GetUsers) } was canceled at user's request.", "Canceled");
        }

        catch (Exception ex)
        {
            // TODO: Log the exception and filter the exception messages which are displayed to users.
            ShowErrorMessage(ex.Message);
        }
    }

    private void ShowErrorMessage(string message, string heading ="")
    {
        //ErrorMessage = message;
        //StateHasChanged();
        ToastService.ShowError(message, heading);
    }

    private void ShowSuccessMessage(string message, string heading = "")
    {
        ToastService.ShowSuccess(message, heading);
    }

    protected void Cancel()
    {
        cts.Cancel();
    }
    #endregion

    #region IDisposable Support

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                cts.Dispose();
            }

            disposedValue = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        // TODO: uncomment the following line if the finalizer is overridden above.
        // GC.SuppressFinalize(this);
    }
    #endregion

}

希望这会有所帮助。

答案 2 :(得分:0)

TLDR

确保您的 razor.cs 文件中的命名空间正确

详细解释

就我而言,当我将类放在错误的命名空间中时出现此错误。 page.razor.cs 文件与 page.razor 文件位于同一目录中,并且它包含一个部分类 as accepted by the October 2019 update

然而,即使文件位于 path/to/dir 中,page.razor.cs 的命名空间为 path.to.another.dir,这会导致抛出此错误。只需将命名空间更改为 path.to.dir 即可为我修复此错误!