使用.NET7和Blazor服务器,我正在try 使用消息组件和List<Message>
作为类库来构建消息查看器,以便在我的环境中的所有应用程序中重复使用.除了可以从列表中删除消息组件之外,一切都运行得很好.Message Razor类如下所示
@namespace TestApp.Components
@if(MessageText!=null){
<div class="mt-3 @MessageClass">
@MessageText
<button class="btn-close" @onclick="CloseMessage">Close</button>
</div>
}
代码后面的相关部分如下所示:
using Microsoft.AspNetCore.Components;
namespace TestApp.Components;
public partial class Message : ComponentBase
{
public string MessageText {get;set;} = string.Empty;
public string MessageClass {get;set;} = string.Empty;
public Guid MessageId {get;set;} = new Guid();
[Parameter] public Message Origin {set{
MessageText=value.MessageText;
MessageClass=value.MessageClass;
MessageId=value.MessageId;
}}
public Message(){
}
public Message(string message){
MessageText=message;
}
public event EventHandler CloseRequested=default!;
private void CloseMessage()
{
CloseRequested(this,EventArgs.Empty);
}
}
然后在保存每个用户的消息列表的应用程序状态类中引用所有这些消息,直到它们被清除.该代码看起来像
using TestApp.Components;
public class ApplicationState
{
public List<Message> Messages {get;set;} = new();
public event EventHandler OnMessagesChange = default!;
public void AddMessage(string messageText)
{
var message = new Message(messageText);
Messages.Add(message);
EventHandler handler = OnMessagesChange;
if(handler!=null)
handler.Invoke(this,EventArgs.Empty);
message.CloseRequested+=RemoveMessage;
}
private void RemoveMessage(object sender, EventArgs e)
{
var message = (Message?)sender;
if(message!=null)
Messages.Remove(message);
}
}
当我单击按钮删除消息时,我得到错误System.NullReferenceException: Object reference not set to an instance of an object.
,我认为这意味着EventHandler已初始化,但我不能确定why并非如此,因为ApplicationState类订阅了该事件,因此它应该是可调用的.
我try 在CloseMessage
方法中判断事件处理程序为空,并将事件处理程序设置为=default!;
,但没有成功.任何帮助都将不胜感激.