如何将Asp.NET Enum转换为Json数组,以便它可以用于敲除选项绑定?
我看到的选项:是创建一些自定义枚举扩展器(创建方法ConvertToJson,将枚举转换为Json)并写入
<script>
var myTypeEnum = @ConvertToJson(typeof(ClientTypeEnum)) ;
</script>
然后我可以使用
<select data-bind="options: myTypeEnum, ....></select>
但我相信有更好的选择,所以我需要自己编写ConverToJson
方法?
答案 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)
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()) + "]"); }
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)