Blazor服务器端C#获取object参数属性报错的解决求助
解决Blazor服务器端从object参数获取属性值的问题
问题根源
- 编译错误CS1061:
object是所有.NET类型的基类,编译阶段无法识别传入对象包含employeeID、departementCode这类自定义属性,直接访问会触发编译错误。 - 反射运行时错误:ASP.NET Core接收JSON请求且参数为
object时,默认会将JSON反序列化为JsonElement(而非普通.NET对象)。JsonElement没有.NET属性,反射的GetProperties()方法找不到对应属性,因此抛出Sequence contains no matching element异常。
最优解决方案:使用强类型模型
这是最安全、易维护的方案,通过定义与请求JSON结构匹配的实体类,让框架自动完成类型转换:
1. 创建请求模型类
public class OwnerRequest { public int employeeID { get; set; } public string departementCode { get; set; } // 可按需添加其他JSON字段对应的属性,如employeeName、jobCode等 }
如果JSON字段名和C#属性名大小写/拼写不一致,可通过JsonPropertyName特性映射:
using System.Text.Json.Serialization; public class OwnerRequest { [JsonPropertyName("employeeID")] public int EmployeeId { get; set; } // 用符合C#命名规范的属性名,映射JSON的employeeID [JsonPropertyName("departementCode")] public string DepartmentCode { get; set; } }
2. 修改控制器方法参数类型
将方法参数从object改为OwnerRequest,直接访问属性即可:
[HttpPost] public ActionResult AddOwnerFile(OwnerRequest owner) { // 注意:employeeID是数字类型,根据数据库字段类型选择是否转字符串 var ownerFileNo = owner.employeeID.ToString(); var departementCode = owner.departementCode; // 使用参数化查询避免SQL注入,官方推荐使用@p0、@p1这类命名占位符 var sql = "INSERT INTO Owner (OwnerFileNo, DepartementCode) VALUES (@p0, @p1)"; var rowsAffected = _context.Database.ExecuteSqlRaw(sql, ownerFileNo, departementCode); return Ok(); }
备选方案:直接处理JsonElement(不推荐)
如果因特殊原因必须使用object参数,可判断对象类型为JsonElement后直接读取JSON节点:
[HttpPost] public ActionResult AddOwnerFile(object owner) { if (owner is not JsonElement jsonElement) { return BadRequest("无效的请求格式"); } var employeeID = jsonElement.GetProperty("employeeID").GetInt32(); var departementCode = jsonElement.GetProperty("departementCode").GetString(); var sql = "INSERT INTO Owner (OwnerFileNo, DepartementCode) VALUES (@p0, @p1)"; var rowsAffected = _context.Database.ExecuteSqlRaw(sql, employeeID.ToString(), departementCode); return Ok(); }
此方案缺乏类型安全,一旦JSON字段名拼写错误或类型变更,会触发运行时异常,仅适合临时场景。
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

