4

有没有办法在.Net(VB或C#)和javascript后面的代码之间共享一个枚举,所以它们都使用相同的值?

我们可以在clientScript中注册一个枚举吗?

编辑: 问题是:有没有办法在.Net 中共享一个像枚举一样的变量,并在 javascript 中做同样的工作。我可以同时在 javascript 和 .Net 中声明,但是如果有人稍后修改代码并在 1 处更改它,一切都会爆炸......这就是为什么我正在寻找“共享”的东西

谢谢

4

3 回答 3

4
//The type of enum we want to use
var enm = typeof(AcceptRejectRule); //or any other enum

//Create the javascript string
var str = "var " + enm.Name + " = {\n" +
        String.Join(",\n", 
               Enum.GetValues(enm).Cast<object>()
               .Select (o => Enum.GetName(enm, o) + ": " + ((int)o))) +
        "\n};";

//Register the javascript to the page for rendering     
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), enm.Name, str, true);
于 2012-08-02T15:32:13.973 回答
1

是的,您可以在 javascript 中镜像一个 .NET 枚举:

C#:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

JS:

var Days = {
    Sat: 0,
    ...
    Fri: 6
};

请注意,这只是一个以Days具有数值的属性命名的对象。Enum在 javascript中没有语言实现。

如果您想要将 C# 枚举自动转换为 javascript,只需使用GetValues迭代 C# 枚举并将其作为 javascript 对象声明注入。它归结为字符串连接,.NET 框架中没有任何内容可以为您执行此操作。

于 2012-08-02T15:10:16.520 回答
0

已经回答但我想我也会分享我的解决方案:

public enum UpdateOptions
{
    Create = 0,
    Read,
    Update,
    Delete,
    None
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ToJSLiteral<UpdateOptions>());

        Console.ReadKey();
    }

    static string ToJSLiteral<T>() where T : struct
    {
        Type type = typeof(T);
        StringBuilder sb = new StringBuilder();
        int[] values = Enum.GetValues(type).Cast<int>().ToArray();
        sb.Append("var " + type.Name + " = {\n");

        foreach(int value in values)
        {
            string name = Enum.GetName(type, value);
            sb.Append(name + " : " + value + ",\n");
        }

        sb.Length -= 2;
        sb.Append("\n};");
        return sb.ToString();
    }
}
于 2013-12-21T16:21:12.723 回答