У меня есть перечисление в моем коде на С#, и я хочу получить то же перечисление в javascript. Есть ли способ сделать это без жесткого кодирования.
Заранее спасибо
У меня есть перечисление в моем коде на С#, и я хочу получить то же перечисление в javascript. Есть ли способ сделать это без жесткого кодирования.
Заранее спасибо
Вы можете сериализовать все значения перечисления в 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>();
Это регистрирует script как:
MyEnum={"Red":1,"Green":2,"Blue":3};
Если вы хотите его как 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>
это будет оцениваться как
Вы можете преобразовать его в список, а затем сериализовать его в 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
, однако альтернативные библиотеки сериализации JSON существуют для .Net.
В вашем javascript-коде вам следует использовать библиотеку сериализации JSON (например, json2) для десериализации списка:
var mylist = JSON.parse($("#MyHiddenField").val());
for (var i in mylist)
{
var item = mylist[i];
}
Обновление: Agg, я обещаю на самом деле прочитать вопрос в следующий раз - перечисление, а не перечислимое!
Вот сообщение, которое ответило на ваш вопрос:
Отлично работает для 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"]
Пожалуйста, дайте мне знать, если есть ошибка или нет, соответствуя соответствующим требованиям, спасибо.
Обратите внимание на следующий ответ, который может быть полезен
Я нашел хорошее решение здесь
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,}
};