将C#Enum转换为Json数组以绑定knockout选项

时间:2013-11-25 12:17:47

标签: c# json knockout.js enums

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

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

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

然后我可以使用

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  1. 扩展HTMLHelper:
  2.     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中:
    2.     var accessLevels = JSON.parse('@(Html.EnumToJson<MyEnum>())');
      

答案 2 :(得分:0)

不完全确定,但你可以尝试这样的事情:

// 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);

答案 3 :(得分:0)

关于扩展Html助手的先前答案很有效,但&lt; T&gt;缺失(或在那种情况下&lt; E&gt;)。它应该是:

        
    public static MvcHtmlString EnumToJson<T>(this System.Web.Mvc.HtmlHelper helper) where T : struct, 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)