【发布时间】:2011-07-07 20:35:58
【问题描述】:
我的 C# 代码中有一个 enum,我想在 javascript 中获得相同的 enum。
有什么方法可以在不进行硬编码的情况下做到这一点?
【问题讨论】:
-
我在这里有一个答案:stackoverflow.com/questions/8345355/… 但使用 MVC/Razor。
标签: javascript asp.net enumeration
我的 C# 代码中有一个 enum,我想在 javascript 中获得相同的 enum。
有什么方法可以在不进行硬编码的情况下做到这一点?
【问题讨论】:
标签: javascript asp.net enumeration
剃须刀
非常适合这样的 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# 服务器端
请查看以下可能有用的答案
【讨论】:
是的,你可以这样做,我是这样做的:
var OrderStateId = parseInt(stateVal);
if (OrderStateId === @((int)OrderStates.Approved)) {
// 5 is the Approved state
if (OrderOption === "Quote") {
$('#quoteDiv').css('display', 'block');
}
【讨论】:
如果你想要它作为视图模型 -> 视图 -> 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>
这将被评估为
【讨论】:
我在这里找到了一个很好的解决方案
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,}
};
【讨论】:
您可以将所有枚举值序列化为 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};
【讨论】:
您可以将其转换为列表,然后将其序列化为 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];
}
更新:Agg,我保证下次会真正阅读这个问题 - 枚举,而不是可枚举!
【讨论】:
这是回答您问题的帖子:
【讨论】: