作者:平凡书生518 | 来源:互联网 | 2023-09-25 10:16
我有一个Blazor(服务器)应用程序,该应用程序运行良好,并且遵守microsoft.CodeAnalysis.FxCopAnalyzers
和StyleCop.Analyzers
设置的所有规则。
一个严重削减的剃须刀页面如下:
@inherits OwningComponentBase
@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("Edit",parameters);
}
}
注意#1:我基于Daniel Roth's suggestion使用了@inherits OwningComponentBase
注意#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”。
建议?
当我使用部分类方法并且尝试设置Identity时,遇到此错误。我改用基类解决了。
我正在使用的
部分课程
在添加一个组件(例如MyComponent)之后,添加一个类MyComponent.razor.cs
用于注射服务
使用
[注入]
公共建筑服务服务{组; }
用于基类方法
在添加一个组件后添加一个例如MyComponent之后,添加一个类MyComponent.razor.cs
更改类名并使其继承于componentBase
MyComponentBase:ComponentBase
并将其放在MyComponent.razor的顶部
@inherits MyComponentBase
使用受保护的关键字使您的方法可访问
,
您的MyPage.razor.cs
应该继承自ComponentBase
类,而您的Mypage.razor
应该继承自MyPage.razor.cs
。
在“代码隐藏”类中,应为要注入的每个服务使用[Inject]
属性,并使其至少具有protected
属性,以便能够在剃须刀组件中使用它们。
下面是我的一个测试应用程序中的一个示例,请注意,它使用.net-core 3.0,在3.1中可以使用部分类。
Index.razor
@page "/"
@inherits IndexViewModel
@if (users == null)
{
Hang on while we are getting data...
}
else
{
Id |
Username |
Email |
FirstName |
LastName |
---|
@foreach (var user in users)
{
@user.Id |
@user.Username |
@user.Email |
@user.FirstName |
@user.LastName |
}
}
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 users;
[Inject] IUsersService UsersService { get; set; }
protected string ErrorMessage { get; set; }
#endregion
#region Constructor
public IndexViewModel()
{
users = new List();
}
#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
}
希望这会有所帮助。
,
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
即可为我修复此错误!