如何在JavaScript中获取C#枚举

32

我在C#代码中有一个enum,想要在Javascript中得到同样的enum,是否有不需要硬编码的方法实现?


我有一个答案在这里:https://dev59.com/sGsy5IYBdhLWcg3wvgn7#13297288,但是使用MVC/Razor。 - valdetero
7个回答

42

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

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

这将注册一个类似于以下的脚本:

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

2
我知道这是一个将近三年的答案,但是我仍然要为我认为是一个非常优雅的解决方案而给予高度赞扬。 - David W

7
如果您希望将其作为视图模型 -> 视图 -> JS
要求:
using Newtonsoft.Json;
using System;

视图模型:

// viewmodel property:
 public string MyEumJson
        {
            get
            {
                return JsonConvert.SerializeObject(Enum.GetValues(typeof(MyEum)), new Newtonsoft.Json.Converters.StringEnumConverter());
            }
        }

然后在你的.cshtml文件中:

@* View *@

<script>
    var myEnumInJS = '@Html.Raw(Model.MyEumJson)';
</script>

这将被评估为

这里输入图片描述


1
如何使用它 - Basheer AL-MOMANI
@BasheerAL-MOMANI 我也有同样的问题,可以试试这样:var text = myEnumInJS[1]' - Reafidy

5

是的,您可以这样做,我就是这样做的:

    var OrderStateId = parseInt(stateVal);

    if (OrderStateId === @((int)OrderStates.Approved)) {
        // 5 is the Approved state
        if (OrderOption === "Quote") {
        $('#quoteDiv').css('display', 'block');
    } 

1
你可以将它转换成列表,然后将其序列化为JSON格式,例如:
// 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)来反序列化您的列表:
var mylist = JSON.parse($("#MyHiddenField").val());
for (var i in mylist)
{
     var item = mylist[i];
}

更新: 呜,我保证下次实际上要阅读问题 - 枚举,不是可枚举


1

对于Razor

像这样完美地适用于Razor

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

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

请让我知道是否有错误或不符合所需的需要,谢谢。
对于C#服务器端
请参阅以下可能有用的答案。

https://dev59.com/Gm435IYBdhLWcg3w1z8t#29184357


0

-2
我在这里找到了一个好的解决方案。

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

我唯一的问题是它不包含Description属性。如果您不使用/需要描述,则它非常完美。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接