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

如何在Razor页面展示API并发处理Put请求的响应?

解决方案:非EditForm场景下展示Put请求的响应内容

一、成功场景处理

请求成功时需完成两个核心操作:

  • 同步页面数据,避免展示旧内容
  • 给用户反馈操作成功的提示

二、错误场景处理

并发冲突触发时,需:

  • 解析API返回的全局/字段级错误信息并展示
  • 更新本地实体的ConcurrencyToken(API已返回最新令牌,不更新会导致后续提交仍触发冲突)
  • 通过UI组件直观提示用户

修改后的完整代码示例

// 假设页面已注入RadzenNotification服务用于提示
[Inject]
public RadzenNotification Notification { get; set; }

// 假设页面绑定的项目列表
public IEnumerable<ProjetModel> Projects { get; set; }

async Task OnUpdateRow(ProjetModel newRow)
{
    var response = await client.PutAsJsonAsync("api/projetbe", newRow);             

    if (response.IsSuccessStatusCode)
    {
        // 1. 刷新页面对应行的最新数据
        var updatedProject = await client.GetFromJsonAsync<ProjetModel>($"api/projetbe/{newRow.Id}");
        if (updatedProject != null)
        {
            var projectList = Projects.ToList();
            var targetIndex = projectList.FindIndex(p => p.Id == newRow.Id);
            if (targetIndex != -1)
            {
                projectList[targetIndex] = updatedProject;
                Projects = projectList;
            }
        }

        // 2. 显示成功提示
        Notification.Notify(new NotificationMessage
        {
            Severity = NotificationSeverity.Success,
            Summary = "操作成功",
            Detail = "项目已更新",
            Duration = 3000
        });
    }
    else
    {
        var errorResponse = await response.Content.ReadFromJsonAsync<Dictionary<string, List<string>>>();
        if (errorResponse != null)
        {
            // 1. 获取最新实体并更新本地并发令牌
            var latestProject = await client.GetFromJsonAsync<ProjetModel>($"api/projetbe/{newRow.Id}");
            if (latestProject != null)
            {
                newRow.ConcurrencyToken = latestProject.ConcurrencyToken;
            }

            // 2. 遍历展示错误信息
            foreach (var kvp in errorResponse)
            {
                if (string.IsNullOrEmpty(kvp.Key))
                {
                    // 全局错误提示
                    Notification.Notify(new NotificationMessage
                    {
                        Severity = NotificationSeverity.Error,
                        Summary = "更新失败",
                        Detail = kvp.Value.FirstOrDefault(),
                        Duration = 5000
                    });
                }
                else
                {
                    // 字段级错误提示
                    foreach (var error in kvp.Value)
                    {
                        Notification.Notify(new NotificationMessage
                        {
                            Severity = NotificationSeverity.Warning,
                            Summary = $"字段错误: {kvp.Key}",
                            Detail = error,
                            Duration = 4000
                        });
                    }
                }
            }
        }
    }
}

替代方案:不用组件的纯页面提示

如果不使用RadzenNotification,可在页面添加绑定的错误区域:

@if (!string.IsNullOrEmpty(GlobalError))
{
    <div class="alert alert-danger mt-2">@GlobalError</div>
}

@foreach (var error in FieldErrors)
{
    <div class="alert alert-warning mt-1">@error</div>
}

然后在代码中定义对应属性并赋值:

public string GlobalError { get; set; }
public List<string> FieldErrors { get; set; } = new();

// 错误处理部分替换为:
foreach (var kvp in errorResponse)
{
    if (string.IsNullOrEmpty(kvp.Key))
    {
        GlobalError = kvp.Value.FirstOrDefault();
    }
    else
    {
        FieldErrors.AddRange(kvp.Value.Select(e => $"{kvp.Key}: {e}"));
    }
}

内容的提问来源于stack exchange,提问作者Sylvain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:40:16