【问题标题】:JsonResults returns Enum value instead of String representationJsonResults 返回枚举值而不是字符串表示
【发布时间】:2017-03-16 13:25:12
【问题描述】:

在我的客户端,我有一个如下所示的 ajax 调用:

          $.ajax({
                url: "Controller/ListResult",
                type: 'POST',
                contentType: "application/json;charset=utf-8",
                data: JSON.stringify({
                    Id: ObjectId,
                    SessionKey: sessionManager.getSessionKey()
                }),
                dataType: "json",
                success: function (result) {
                var test = results;
                    }
                }
            });

在控制器中我有一个这样的方法:

      [HttpPost]
       public JsonResult ListResult(string Id, string SessionKey)
       {
        IBl biz = new BL();
        var result = biz.GetResults(Id,SessionKey);
        return Json(result);
       }

问题是控制器返回是一个具有Enum属性的对象(其字符串表示为值)的结果。但是,当它在 ajax 调用中达到 success function 时,枚举不再是字符串表示,而是已转换为它们的 int 价值观。我怎样才能避免这种情况?并将字符串表示形式保留在 javascript 端。

【问题讨论】:

  • 什么是sessionManager.getSessionKey()
  • @StephenMuecke,它是检索会话的内部函数,但这不会影响任何事情。因为它按预期工作。
  • 您需要创建一个匿名对象来表示您的数据并在枚举属性上使用ToString()JavascriptSerializer 将枚举序列化为它们的数值而不是它们的字符串表示)
  • 嗨本杰明,你能试试这个吗 return Json(result.ToList(), JsonRequestBehavior.AllowGet);
  • 您还可以在您的属性中使用 Json.NET[JsonConverter(typeof(StringEnumConverter))] 属性

标签: c# ajax asp.net-mvc enums


【解决方案1】:

创建一些结果实体类,而不是返回var result,您可以使用StringEnumConverter 标记那里的枚举属性。

class Result
{
  [JsonConverter(typeof(StringEnumConverter))]
  public EnumType EnumProperty { get; set; }

  *****other properties goes here****
}

正如斯蒂芬建议的那样,如果使用Json.NET 作为序列化程序,这将有效。

【讨论】:

  • 仅当 OP 使用 Json.NET 作为序列化程序时:)
【解决方案2】:

试试这样的:

    var result = biz.GetResults(Id,SessionKey);
    var modifiedResult = new
      {
        ...,
        r.EnumValue.ToString(),
        ...
      };
    return Json(modifiedResult);

【讨论】:

  • 正如我所说,Controller 中的结果已经是 String 表示,不需要 ToString() 它。当它到达 Javascript 端时,它只是被转换为 int 值。
  • 如果控制器返回的结果中的属性是枚举,则对return Json(result) 的调用会将这些字符串转换回它们的整数值。如果您首先将结果投影到匿名类型中,那么属性将只是字符串。
  • 几乎正确 - 但您不能在单个对象上使用 .Select()(这是 OP 所说的 GetResults() 方法返回
  • @Stephen -- 感谢您的反馈,答案已更新。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多