.NET 8 Blazor组件属性变更后UI未更新问题求助
Blazor .NET 8 实时更新Markdown内容失效问题
我基于.NET 8开发了一个Blazor应用,用来读取Markdown文件并在页面展示。首次加载时内容显示正常,同时通过文件监听事件实现了文件变化的监听逻辑,目的是文件更新后页面能实时刷新展示新内容。
目前遇到的问题:文件更新后,控制台打印确认变量已获取到预期的新文本,但页面始终不展示新内容,只有手动按下浏览器F5刷新后,新内容才会显示。
已尝试的解决方法均无效:
- 调用
NavigationManager.NavigateTo("/", true) - 执行
JSRuntime.InvokeVoidAsync("location.reload") - 触发
StateHasChanged()
FileService.cs 代码
namespace MarkFlow.FileService; public class FileService : IFileService { public event Func<Task>? OnFileChanged; private readonly string _path = string.Empty; public FileService(string path) { _path = path; } public async Task<string> ReadFileAsync() { using var stream = File.OpenRead(_path); using var reader = new StreamReader(stream); return await reader.ReadToEndAsync(); } public void MonitorFile() { var directory = Path.GetDirectoryName(_path); var filename = Path.GetFileName(_path); var watcher = new FileSystemWatcher() { Path = directory, Filter = filename, NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName }; watcher.Changed += async (sender, args) => { try { await Task.Delay(1000); OnFileChanged?.Invoke(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }; watcher.EnableRaisingEvents = true; } }
Home.razor 代码
@page "/" @attribute [StreamRendering(true)] @using MarkFlow.FileService @using Markdig @inject IFileService FileService @inject NavigationManager NavigationManager <div class="wrapper"> @if (@Html is not null) { @Html } else { <p>loading...</p> } </div> @code { private MarkupString? Html { get; set; } protected override async Task OnInitializedAsync() { if (FileService is null) return; FileService.OnFileChanged += FileChanged; FileService.MonitorFile(); await LoadFileContent(); } private async Task FileChanged() { await LoadFileContent(); NavigationManager.NavigateTo("/", true); } private async Task LoadFileContent() { var markdown = await FileService.ReadFileAsync(); Html = (MarkupString)(Markdown.ToHtml(markdown)); } }
内容的提问来源于stack exchange,提问作者ShNeoteric
相关产品推荐
相关产品推荐

