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

C# 将C Enum转换为Json数组以绑定敲除选项,c#,json,knockout.js,enums,C#,Json,Knockout.js,Enums,如何将Asp.NET枚举转换为Json数组,以便将其用于敲除选项绑定 我看到的选项是:创建一些自定义的enum extender创建方法ConvertToJson,将enum转换为Json并写入 <script> var myTypeEnum = @ConvertToJson(typeof(ClientTypeEnum)) ; </script> 然后我可以使用 <select data-bind="options: myTypeEnum, ....&

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

我看到的选项是:创建一些自定义的enum extender创建方法ConvertToJson,将enum转换为Json并写入

<script>
    var myTypeEnum = @ConvertToJson(typeof(ClientTypeEnum)) ; 
</script>
然后我可以使用

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

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

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

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

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

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Converters.Add(new StringEnumConverter());
通过这种设置,它只处理与字符串表示之间的枚举序列化和反序列化。看来你可以

扩展HTMLHelper: 在javascript中:
前面关于扩展Html帮助程序的回答非常有效,但是缺少了,或者在这种情况下。应该是:

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()) + "]"); }
如果可以的话,我会在原始答案中添加它作为注释,但我的帐户需要有50个点才能注释o_o

您需要枚举值还是名称?或者两者都有?嗯。。我相信两者都需要。我需要将更新值保存到DB中,因此可能需要ID并显示用户名。我需要json数组,我不明白这与数组有什么关系?您需要返回一个包含所有枚举值的数组,serialiser会将它们转换为字符串表示形式,所以您将得到枚举字符串的列表。具有该枚举类型属性的任何其他对象的值也将作为字符串表示形式返回,因此您可以通过简单的字符串比较映射选定的枚举值。如果我不需要枚举值,但需要使用anotations定义的描述,该怎么办? var accessLevels = JSON.parse('@(Html.EnumToJson<MyEnum>())'); 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())');