Controller返回的string对象无法在Razor Component中读取的问题
问题原因与解决方案
问题根源
当ASP.NET Core的Controller直接返回string类型时,框架默认会把它作为**纯文本(text/plain)**返回,内容就是字符串本身(比如test),而GetFromJsonAsync<T>方法要求响应内容是标准JSON格式。标准的JSON字符串必须被双引号包裹(比如"test"),纯文本的字符串不符合JSON语法规则,所以解析时会抛出JSON语法错误。
而返回自定义对象(比如MyObject)时,框架会自动序列化为标准的JSON对象,符合GetFromJsonAsync<T>的解析要求,所以能正常工作。
解决方法
方法1:将字符串包装为对象返回
创建一个简单的包装类,把字符串作为属性返回,这样框架会自动序列化为合法的JSON对象:
// 新增包装类 public class StringResponse { public string Value { get; set; } } // 修改Controller方法 [HttpGet("GetString")] public async Task<StringResponse> GetString(int? id) { string retval = ""; // ... 业务逻辑 return new StringResponse { Value = retval }; } // 前端调用 var response = await _http.GetFromJsonAsync<StringResponse>("My/GetString?id=15"); string myString = response.Value;
方法2:强制返回JSON格式的字符串
在Controller方法中使用Json()方法返回,这样会把字符串包装为标准的JSON字符串(带双引号),同时响应的Content-Type会设为application/json:
[HttpGet("GetString")] public async Task<IActionResult> GetString(int? id) { string retval = ""; // ... 业务逻辑 return Json(retval); } // 前端调用保持不变 string myString = await _http.GetFromJsonAsync<string>("My/GetString?id=15");
方法3:前端改用GetStringAsync获取纯文本
既然后端返回的是纯文本,前端直接用GetStringAsync获取,不需要JSON解析:
// 前端修改调用方式 string myString = await _http.GetStringAsync("My/GetString?id=15");
内容的提问来源于stack exchange,提问作者MrWuf
相关产品推荐
相关产品推荐

