关于asp.net:如何在Javascript中获取C#枚举

How to get Get a C# Enumeration in Javascript

我的C代码中有一个枚举,我希望在JavaScript中获得相同的枚举。有没有没有办法不用硬编码来实现这个目的?

提前谢谢


可以将所有枚举值序列化为json:

1
2
3
4
5
6
7
8
9
10
11
private void ExportEnum<T>()
{
    var type = typeof(T);
    var values = Enum.GetValues(type).Cast<T>();
    var dict = values.ToDictionary(e => e.ToString(), e => Convert.ToInt32(e));
    var json = new JavaScriptSerializer().Serialize(dict);
    var script = string.Format("{0}={1};", type.Name, json);
    System.Web.UI.ScriptManager.RegisterStartupScript(this, GetType(),"CloseLightbox", script, true);
}

ExportEnum<MyEnum>();

这会注册如下脚本:

1
MyEnum={"Red":1,"Green":2,"Blue":3};


是的,你可以这样做,我是这样做的:

10


如果您希望它作为viewmodel->view->js

要求:

1
2
using Newtonsoft.Json;
using System;

Viewmodel:

1
2
3
4
5
6
7
8
// viewmodel property:
 public string MyEumJson
        {
            get
            {
                return JsonConvert.SerializeObject(Enum.GetValues(typeof(MyEum)), new Newtonsoft.Json.Converters.StringEnumConverter());
            }
        }

然后在.cshtml中:

1
2
3
4
@* View *@


    var myEnumInJS = '@Html.Raw(Model.MyEumJson)';

这将被评估为

enter image description here


这是回答你问题的帖子:

枚举作为字符串的JSON序列化


您可以将其转换为列表,然后将其序列化为JSON,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// In the code-behind
private void _Default_Load(object sender, EventArgs e)
{
    var objects = GetObjects();

    var serialiser = new JavaScriptSerializer();
    this.MyHiddenField.Value = serialiser.Serialize(objects);
}

// Example enumerable
static IEnumerable<MyClass> GetObjects()
{
    for (int i = 0; i < 10; i++)
    {
        yield return new MyClass();
    }
}

上面要求.NET 3.5和对System.Web.Extensions程序集的引用(用于JavaScriptSerializer,但是.NET有其他JSON序列化库。

在您的javascript代码中,您应该使用JSON序列化库(如JSON2)来反序列化您的列表:

1
2
3
4
5
var mylist = JSON.parse($("#MyHiddenField").val());
for (var i in mylist)
{
     var item = mylist[i];
}

更新:agg,我保证下次实际阅读问题-枚举,不可枚举!


剃刀

非常适合这种剃刀

1
2
3
4
5
6
7
var Enumerators = {
   System: {
           @{
               <text>DayOfWeek: JSON.parse('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Enum.GetValues(typeof(DayOfWeek)), new Newtonsoft.Json.Converters.StringEnumConverter()))')</text>
           }
    }
}

这将在javascript中产生类似的结果。

1
Enumerators.System.DayOfWeek = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]

如果有错误或不符合要求,请告诉我,谢谢。

对于服务器端

请查看以下可能有用的答案

https://stackoverflow.com/a/29184357/6737444


我在这里找到了一个很好的解决方案

http://fairwaytech.com/2014/03/making-c-enums-available-within-javascript/

我唯一的问题是它没有携带Description属性。如果您不使用/不需要描述,那么它是完美的。

这为您提供了客户端的访问,如下所示:

1
2
3
4
var Enums = {
    phoneType: {phone:1,fax:2,voiceMail:3,cell:4,},
    addressType: {mailing:1,physical:2,}
    };