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中配置忽略大小写:
若使用Newtonsoft.Json,则配置:services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });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
相关产品推荐
相关产品推荐

