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

Angular 9 向 .NET 3.1 控制器传值失败,后端接收对象为null求助

Angular 9 无法向.NET 3.1控制器正常传值的问题排查

问题描述

Angular 9前端向.NET 3.1控制器传递对象时,前端通过console.log确认对象已正确赋值,但控制器断点处接收的对象始终为null。已尝试的方案:

  • 在Startup中配置CORS
  • 确保Angular与.NET对象的属性拼写、大小写完全一致
  • 给控制器方法添加[HttpPost]特性
  • 改用GET请求通过URL参数传递JSON字符串可成功,但不符合业务需求

相关代码

.NET 代码

// 模型类
public class AccountLookupRequest
{
     public string FILENO { get; set; }
     public string AccountName { get; set; }
     public string SSN { get; set; }
}

// 控制器方法(当前尝试版本)
public IActionResult GetAccounts([FromBody] AccountLookupRequest request) 
{
    List<AccountLookupResponse> results = new List<AccountLookupResponse>();
    try
    {
        results = _clsRepo.GetAccounts(request);
    }
    catch (Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, new { Message = $"{ex.Message}\n\n{ex.StackTrace}" });
    }
    return Ok(results);
}

Angular 代码

// 模型类
export class AccountLookupRequest{
  public FILENO: string;
  public AccountName: string;
  public SSN: string;
  constructor() { }
}

// 服务方法(当前尝试版本)
getAccounts(accountlookup: AccountLookupRequest):Observable<any> {
  console.log('accountlookup', accountlookup);
  const httpOptions = {
    headers: new HttpHeaders({
      'Content-Type': 'application/json'
    })
  };
  return this.http.post(this._AccountLookup, accountlookup, httpOptions);
}

可尝试的解决方法

  • 确认控制器路由与请求URL匹配:给控制器方法明确添加[HttpPost("GetAccounts")]特性,同时检查前端this._AccountLookup的URL是否与路由一致(比如控制器有[Route("api/[controller]")]时,完整URL应为/api/xxx/GetAccounts),避免路由冲突导致请求匹配到错误方法。
  • 配置JSON反序列化忽略大小写:.NET Core默认的System.Text.Json区分大小写,可在Startup.cs中配置忽略大小写:
    services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        });
    
    若使用Newtonsoft.Json,则配置:
    services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.SerializerSettings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
        });
    
  • 手动序列化Angular请求体:虽然HttpClient默认会序列化,但手动序列化确保格式正确:
    getAccounts(accountlookup: AccountLookupRequest): Observable<any> {
      console.log('accountlookup', accountlookup);
      const body = JSON.stringify(accountlookup);
      const httpOptions = {
        headers: new HttpHeaders({
          'Content-Type': 'application/json'
        })
      };
      return this.http.post(this._AccountLookup, body, httpOptions);
    }
    
  • 验证请求头与Payload:通过浏览器开发者工具的Network标签,确认请求的Content-Type确实是application/json,且Request Payload中的JSON结构正确、属性无缺失或拼写错误。
  • 检查模型构造函数:确保.NET的AccountLookupRequest类存在公开的无参构造函数,这是JSON反序列化的必要条件。
  • 排查路由冲突:确认控制器中没有其他同名的GetAccounts方法(比如GET类型),避免POST请求被错误匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:15:54