如何获取IHttpActionResult返回结果中包含的实际字符串值
问题原因说明
你调用GetUserRole()返回的是实现IHttpActionResult接口的OkNegotiatedContentResult<string>类型实例,直接调用ToString()输出的是类型名称,并不是你封装在结果里的业务值。
解决方案
方案1:抽离公共逻辑(最推荐)
同控制器内不需要重复调用Action接口,把获取用户角色的逻辑单独抽成私有方法,两边直接调用即可,没有多余的类型转换开销,可维护性更高:
// 抽离的公共业务方法 private string GetUserRoleValue() { ManageUserData ObjManageUserData = new ManageUserData(); string UserRole = string.Empty; var dt = ObjManageUserData.GetUserRole(UserPersonalNumber); if (dt.Rows.Count > 0) UserRole = dt.Rows[0][0].ToString(); else UserRole = "User"; return UserRole; } // 原GetUserRole接口改造为调用公共方法 [HttpPost] [Route("GetUserRole")] public IHttpActionResult GetUserRole() { return Ok(GetUserRoleValue()); } // 另一个方法里直接调用公共方法取值 [HttpPost] [Route("GetTableValue")] public IHttpActionResult GetTableValue() { try { List<UserModel> userModels = new List<UserModel>(); var UserID = UserAdId; // 直接拿到字符串值 var UserRole = GetUserRoleValue(); return Ok(UserRole); } catch (Exception ex) { // 补充你的异常处理逻辑 return InternalServerError(ex); } }
方案2:强制转换IHttpActionResult取值(仅做参考)
如果你一定要直接调用Action方法从返回结果中取值,可以强转为对应的实际实现类型后读取Content属性:
[HttpPost] [Route("GetTableValue")] public IHttpActionResult GetTableValue() { try { List<UserModel> userModels = new List<UserModel>(); var UserID = UserAdId; // 强转为对应返回类型后取Content属性 var actionResult = GetUserRole() as System.Web.Http.Results.OkNegotiatedContentResult<string>; var UserRole = actionResult?.Content ?? "User"; return Ok(UserRole); } catch (Exception ex) { return InternalServerError(ex); } }
注意:该写法依赖Action的返回实现类型,如果后续修改了
GetUserRole的返回逻辑(比如返回NotFound()),强转会得到null,容易触发空引用异常,因此优先使用方案1。
内容的提问来源于stack exchange,提问作者sambit
相关产品推荐
相关产品推荐

