4

コード ビハインド .Net (VB または C#) と JavaScript の間で列挙型を共有して、両方が同じ値を使用する方法はありますか?

enum を 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数値を持つプロパティで名前が付けられた単なるオブジェクトであることに注意してください。Enumin 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 に答える