JsonResults返回枚举值而不是字符串表示形式

4
在我的客户端,我有一个类似下面的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);
       }

这个问题是由于控制器返回的对象中有枚举属性(它们的值是字符串表示形式),然而,当它到达ajax调用中的success函数时,枚举不再是字符串表示形式,而是已经转换为它们的整数值。我该如何避免这种情况?并保留javascript端的字符串表示形式。


sessionManager.getSessionKey() 是什么? - user3559349
@StephenMuecke,这是一个用于检索会话的内部函数,但这不应该影响任何事情。因为它按预期工作。 - Benjamin
4
你需要创建一个匿名对象来表示你的数据,并在枚举属性上使用 ToString() 方法(JavascriptSerializer 序列化枚举时会将其序列化为数字值而不是字符串表示)。 - user3559349
嗨,本杰明,你能试试这个吗?返回 Json(result.ToList(), JsonRequestBehavior.AllowGet); - Saineshwar Bageri - MVP
3
你也可以在属性上使用[JsonConverter(typeof(StringEnumConverter))]特性,同时使用Json.NET来进行转换。 - user3559349
@StephenMuecke,谢谢你Stephen。你是完全正确的。 - Benjamin
2个回答

7

不要返回var result,而是创建一些结果实体类,并在其中使用StringEnumConverter标记枚举属性。

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

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

正如Stephen所建议的那样,如果使用Json.NET作为序列化器,则此方法有效。

只有当 OP 使用 Json.NET 作为序列化器时才成立 :) - user3559349

3

试试类似这样的代码:

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

正如我所说,控制器中的结果已经是字符串表示形式了,因此无需使用ToString()。当它到达Javascript端时,它只会被转换为整数值。 - Benjamin
如果控制器返回结果中的属性是枚举类型,那么调用 return Json(result) 将把这些字符串转换回它们的整数值。如果您首先将结果投影到匿名类型中,则属性将仅为字符串。 - Jimmy Joe
1
几乎正确 - 但是你不能在单个对象上使用.Select()(这就是OP所述的GetResults()方法返回的内容。 - user3559349
@Stephen -- 感谢你的反馈,回答已经更新。 - Jimmy Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接