【问题标题】:convert C# Enum to Json array to bind knockout options将 C# Enum 转换为 Json 数组以绑定淘汰赛选项
【发布时间】:2013-11-25 12:17:46
【问题描述】:

如何将 Asp.NET Enum 转换为 Json 数组,以便用于敲除选项绑定?

我看到的选项:是创建一些自定义枚举扩展器(创建将枚举转换为 Json 的方法 ConvertToJson)并编写

<script>
    var myTypeEnum = @ConvertToJson(typeof(ClientTypeEnum)) ; 
</script>

然后我可以使用

 <select data-bind="options: myTypeEnum, ....></select>

但我相信有更好的选择,所以我需要自己写ConverToJson方法吗?

【问题讨论】:

  • 您需要枚举的值还是名称?还是两者兼而有之?
  • 嗯..我相信两者都需要。我需要将更新值保存到 DB(所以这里可能需要 Id)并显示用户名。

标签: c# json knockout.js enums


【解决方案1】:

我意识到这是在视图中使用 Web API 而不是 Razor,但我们已经设置 Json.Net 将 Enums 转换为字符串:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Converters.Add(new StringEnumConverter());

通过这种设置,它只处理与字符串表示之间的序列化和反序列化枚举。看来你可以set it up for Asp.Net

【讨论】:

  • 我需要json数组,不明白这和数组有什么关系?
  • 您需要返回一个包含所有枚举值的数组,序列化程序会为您将它们转换为字符串表示形式,因此您将获得枚举字符串的列表。具有该枚举类型属性的任何其他对象也将其值作为字符串表示形式返回,因此您可以通过简单的字符串比较来映射选定的枚举值。
  • 如果我不需要枚举值,而是描述(使用注释定义)怎么办?
【解决方案2】:
  1. 扩展 HTMLHelper:
public static MvcHtmlString EnumToJson(this System.Web.Mvc.HtmlHelper helper) where E : struct, IConvertible { var values = from E e in Enum.GetValues(typeof(E)) select String.Format(@"{{""Val"": {0:d}, ""Text"": ""{1}"" }}", e, e.ToString()); return MvcHtmlString.Create("[" + String.Join(",", values.ToArray()) + "]"); }
  1. 在javascript中:
var accessLevels = JSON.parse('@(Html.EnumToJson())');

【讨论】:

    【解决方案3】:

    不完全确定,但您可以尝试以下方法:

    // here is the string you pass to the client, a list separated by commas like Aaa, Bbb, Ccc
    string result = Enum.GetNames(typeof(ClientTypeEnum)).Aggregate((s1, s2) => string.Format("{0},{1}", s1, s2)); 
    
    // then a client sends a string to the server and you parse it like this
     ClientTypeEnum cte = (ClientTypeEnum) Enum.Parse(typeof(ClientTypeEnum), "EnumStr", true);
    

    【讨论】:

      【解决方案4】:

      先前关于扩展 Html 帮助程序的答案效果很好,但是缺少 (或者在这种情况下是 )。应该是:

      公共静态 MvcHtmlString EnumToJson(此 System.Web.Mvc.HtmlHelper 助手)其中 T :结构,IConvertible { var values = from T e in Enum.GetValues(typeof(T)) select String.Format(@"{{""Value"": {0:d}, ""Text"": ""{1}"" }}", e, e.ToString()); return MvcHtmlString.Create("[" + String.Join(",", values.ToArray()) + "]"); } var accessLevels = JSON.parse('@(Html.EnumToJson())');

      (如果可以的话,我会把它作为评论添加到原始答案中,但我的帐户需要有 50 分才能评论 o_O)

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 1970-01-01
        • 2013-05-04
        • 2017-08-08
        • 2013-12-06
        相关资源
        最近更新 更多