You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:52:33