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

无法从应用控制器调用API创建笔记,返回400错误求助

笔记站点API调用400错误排查

我开发了一个带笔记创建功能的站点,输入笔记后调用API传入NoteViewModel存入数据库,但调用时返回400错误,且未进入API控制器执行。测试用控制器里的相同代码能正常运行,GET请求也没问题,所有路径和命名都确认正确。

相关代码如下:

应用控制器代码

[HttpPost]
public async Task<IActionResult> CreateNote(string? NoteText, string? NoteTitle)
{
    //Plug
    NoteViewModel viewModel = new NoteViewModel()
    {
        ClientId = 1,
        NoteTypeId = 1,
        NoteText = NoteText,
        EditDate = DateTime.Now,
        NoteTitle = NoteTitle
    };
    string data = JsonConvert.SerializeObject(viewModel);
    StringContent content = new StringContent(data.ToLower(), Encoding.UTF8, "application/json");
    HttpResponseMessage response = await _client.PostAsync(baseAddres + "/DailyNotes/CreateNote", content);
    if (response.IsSuccessStatusCode)
    {
        return RedirectToAction("Notes", new { clientId = 1});
    }
    return View();
}

API控制器代码

[HttpPost]
public async Task<ActionResult<Note>> CreateNote(NoteViewModel note)
{
    try
    {
        if (note == null)
            return BadRequest("Cant be Null");
        await _dailyNotesRepository.CreateNote(note);
        return Ok(note);
    }
    catch(Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

仓储层CreateNote方法代码

public async Task<Note> CreateNote(NoteViewModel note)
{
        Note newNote = new Note()
        {
            ClientId = note.ClientId,
            NoteTypeId = note.NoteTypeId,
            NoteTitle = note.NoteTitle,
            NoteText = note.NoteText,
            EditDate = note.EditDate
        };
        var result = await _context.Notes.AddAsync(newNote);
        await _context.SaveChangesAsync();
        return result.Entity;
}

(响应断点截图:响应断点截图)

已尝试多种方法,确认路径与命名无误,但问题仍未解决。


排查方向与解决方案

1. 序列化大小写不匹配

你在序列化后调用了data.ToLower(),会把所有JSON属性名转成小写(比如clientid),但API端的NoteViewModel属性是PascalCase格式(比如ClientId)。ASP.NET Core默认模型绑定对大小写敏感,会导致无法匹配属性,直接返回400错误,不会进入控制器方法。

解决方法:移除data.ToLower(),保留原始序列化的属性名格式:

string data = JsonConvert.SerializeObject(viewModel);
StringContent content = new StringContent(data, Encoding.UTF8, "application/json");

2. 可选:配置模型绑定忽略大小写

如果需要兼容小写属性名的JSON,可在API项目的Program.cs中配置JSON序列化选项:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
    });

3. 检查模型必填属性

如果NoteViewModel中有标记[Required]的属性,而传入的JSON里这些属性为空或缺失,模型验证会直接失败返回400。检查模型类的注解,确保所有必填属性都有有效值。

4. 获取详细错误信息

在应用控制器中读取响应内容,查看具体的验证失败原因:

var errorMessage = await response.Content.ReadAsStringAsync();
// 将errorMessage输出到日志或调试窗口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:11