ASP.NET Core Web API报CS0103错误jsonString不存在当前上下文如何解决
错误原因
- 变量作用域限制:
jsonString是FromMandateDtoToMandate方法内的局部变量,仅在该方法内部可访问,离开方法作用域后就会被销毁,其他方法无法直接读取。 - 代码存在其他隐性编译错误:
FromMandateDtoToMandate方法内局部变量名和参数名均为mandate,变量重名会触发编译报错FromMandateDtoToTransactionLog方法要求传入TransactionDto类型参数,你调用时传入的是Mandate类型对象,类型不匹配Post方法末尾有两个连续return语句,第二个return transaction永远不会执行,且方法返回值类型为Task<Mandate>,也不支持返回TransactionLog类型对象
修复方案
推荐使用元组返回值的方式传递序列化后的JSON字符串,无额外线程安全风险,逻辑清晰:
1. 修改EntityMapper代码
public class EntityMapper { // 返回元组同时输出Mandate实体和序列化后的JSON public (Mandate mandateEntity, string serializeJson) FromMandateDtoToMandate(MandateDto mandateDto) { var mandateEntity = new Mandate() { DueDate = mandateDto.DueDate, StartDate = mandateDto.StartDate, EndDate = mandateDto.EndDate, MandateId = mandateDto.MandateId }; string jsonString = JsonSerializer.Serialize(mandateEntity); return (mandateEntity, jsonString); } // 调整参数直接接收JSON字符串生成TransactionLog public TransactionLog FromJsonToTransactionLog(string rawJson) { return new TransactionLog { RawData = rawJson }; } }
2. 修改MandateService的Post方法
public async Task<Mandate> Post(MandateDto mandateDto) { var mapper = new EntityMapper(); var (mandateEntity, mandateJson) = mapper.FromMandateDtoToMandate(mandateDto); var transaction = mapper.FromJsonToTransactionLog(mandateJson); try { await _unitOfWork.MandateRepository.Insert(mandateEntity); await _unitOfWork.TransactionRepository.Insert(transaction); await _unitOfWork.SaveChangesAsync(); } catch (Exception e) { // 保留原始异常栈信息方便排查问题 throw new Exception("数据保存失败", e); } return mandateEntity; }
补充说明
如果要保留原有Mapper的方法结构,也可以将jsonString作为FromMandateDtoToTransactionLog的入参数直接传入,不需要调整返回值,本质逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Olugbenga
相关产品推荐
相关产品推荐

