Как получить Перечисление C # в Javascript - PullRequest
25 голосов
/ 03 марта 2011

У меня есть перечисление в моем коде C #, и я хочу получить то же самое перечисление в javascript.Есть ли способ сделать это без жесткого кодирования.

Заранее спасибо

Ответы [ 7 ]

36 голосов
/ 15 марта 2013

Вы можете сериализовать все значения перечисления в 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};
3 голосов
/ 19 февраля 2018

Да, вы можете сделать это так, я сделал это так:

    var OrderStateId = parseInt(stateVal);

    if (OrderStateId === @((int)OrderStates.Approved)) {
        // 5 is the Approved state
        if (OrderOption === "Quote") {
        $('#quoteDiv').css('display', 'block');
    } 
3 голосов
/ 21 марта 2015

Если вы хотите использовать его как viewmodel -> view -> JS

Требуется:

using Newtonsoft.Json;
using System;

ViewModel:

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

это будет оценено как

enter image description here

1 голос
/ 03 марта 2011
1 голос
/ 03 марта 2011

Вы можете преобразовать его в список и затем сериализовать его в 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];
}

Обновление: Агг, я обещаю на самом деле прочитать вопрос в следующий раз - перечисление , а не перечисление !

0 голосов
/ 23 декабря 2016

Для 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>
           }
    }
}


Это даст такой результат в javaScript
Enumerators.System.DayOfWeek = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]

Пожалуйста, дайте мне знатьесли есть ошибка или она не соответствует нужной потребности, спасибо

Для C # Server Side

Пожалуйста, посмотрите следующий ответ, который может быть полезен

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

0 голосов
/ 19 октября 2015

Я нашел хорошее решение здесь

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,} 
    };
...