如何将 C# 枚举列表传递和使用到 Javascript 文件并在其中使用

问题描述 投票:0回答:5

我有 C# 枚举列表类,

namespace MyProject.MyEnumListClass
{
 public enum MyEnum
  {
    ValueOne,
    ValueTwo,
    ValueThree,
    ValueFour,
    ValueFive,
    ValueSix
   }
 }

这就是我在 razor cshtml 内的 javascript 中使用此列表的方式

@using MyProject.MyEnumListClass

<script>
  .....

if (type != "@((int)MyEnum.ValueThree)") 

 .....
</script>

通过使用 razor 的

@
在 javascript 代码中引用这些枚举值,可以在 razor 中轻松完成此操作。但现在, 我想将此 javascript 代码分离到
.js
文件中,并且我尝试将此枚举列表传递到 javascript 文件并在其中使用。
在 javascript 独立文件中使用 C# 枚举列表的最佳和正确方法是什么?

javascript c# enums
5个回答
7
投票

C#代码在服务器上执行。 JS代码在浏览器上执行。

您将无法在 javascript 中获取 C# 枚举引用。

最好的方法是在 javascript 中定义一个对象,该对象与 Enum 中存在的值相同。 然后该对象就可以在您的 JavaScript 代码中使用。

如果您使用纯 javascript,JS 代码将如下所示:

var SizeEnum = {
  SMALL: 1,
  MEDIUM: 2,
  LARGE: 3,
};

如果您想了解有关 javascript 语法的更多信息,请参阅 本文

编辑:

如果您不想在 JS 文件中显式指定它们,那么您可以编写扩展方法如本文中指定的。这会将 C# 枚举转换为 JS 枚举。这也将帮助您保持 JS 代码始终与 C# 枚举同步。

public static class EnumHelper
{
    public static HtmlString EnumToString<T>()
    {
        var values = Enum.GetValues(typeof(T)).Cast<int>();
        var enumDictionary = values.ToDictionary(value => Enum.GetName(typeof(T), value));
        return new HtmlString(JsonConvert.SerializeObject(enumDictionary));
    }
}

然后您可以在 razor 文件中使用它,如下所示。因为这是一个脚本,所以这个变量应该在您的 JS 文件中可用。

<script>
    var assetStatusEnum = @(EnumHelper.EnumToString<SizeEnum>())
</script>

注意:这将创建一个可以在 JavaScript 中使用的 JSON 对象。 此解决方案仅适用于使用纯 JavaScript 的情况。 如果您使用打字稿,我建议在打字稿中使用并行类,因为它们会在编译时提供更好的类型检查。


2
投票

您可以通过简单的方式在javascript中获取Enum值

<script>
var aggregateFunctions= @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Enum.GetNames(typeof(Address.AggregateFunc))));

这里在aggregateFunctions 中获取枚举值数组


0
投票

这是我使用的解决方案:

public enum FunValues
{
    Fish,
    Turkey,
    Hotdog,
    Trash
}

在我使用的cshtml中:

var funValues = '@Html.Raw(Json.Encode(EnumHelper.GetSelectList(typeof(FunValues))))';

然后在JS中我使用:

// someInt is the past in int that is 1 but I need to get the string 
// "Turkey" out of it so I used the following
var fns = JSON.parse(funValues);
var result = '';
fns.map(val => { if(val.Value == someInt) result = val.Text });
// result now equals "Turkey"

0
投票

我在自己的项目中使用它。枚举值,枚举名称,枚举描述,采用数组格式。使用时它提供了很大的自由度 cs侧。 Manoj Choudhari你为我贡献了想法,谢谢

public enum DayOfWeekTR
{
    [Description("Pazar")]
    pzr = 0,
    [Description("Pazartesi")]
    pzts = 1,
    [Description("Salı")]
    sali = 2,
    [Description("Çarşamba")]
    car = 3,
    [Description("Perşembe")]
    per = 4,
    [Description("Cuma")]
    cuma = 5,
    [Description("Cumartesi")]
    cmrts = 6
}
public enum DepoTipi { ana = 1, sube = 2, uretim = 3 }
public class WebTools {
    
     public static object EnumIslems<T>() where T : struct, IConvertible
     {
         IDictionary<string, object> ret = new ExpandoObject();
         var t = typeof(T);
         var vs = Enum.GetValues(t);
         ret["Enum"] = vs.Cast<int>().ToDictionary(x => Enum.GetName(t, x));
         if (t.GetFields().Any(x => x.GetCustomAttributes(typeof(DescriptionAttribute), false).Any()))
         {
             ret["Array"] = ((T[])vs).Select(x => new
             {
                 vl = Convert.ToInt32(x),
                 tx = x.GetDescription()
             }).ToArray();
         }
         return ret;
     }
}
public static class WebExtensions {
    public static string GetDescription<T>(this T value, string defaultvalue = "") where T : struct, IConvertible
    {
        var type = typeof(T);
        if (type.IsEnum)
        {
            var name = Enum.GetName(type, value);
            if (name.IsNullEmpty()) { return defaultvalue; }
            else
            {
                var customAttribute = type.GetField(name).GetCustomAttributes(typeof(DescriptionAttribute), false);
                return (customAttribute.Length > 0 ? ((DescriptionAttribute)customAttribute[0]).Description : name);
            }
        }
        else { throw Genel.NotImplementedExceptionWarning<T>(); }
    }
    public static MvcHtmlString Enums(this HtmlHelper html)
    {
        IDictionary<string, object> ret = new ExpandoObject();
        foreach (var item in new Type[] { typeof(DayOfWeekTR), typeof(DepoTipi) }) { ret[item.Name] = typeof(WebTools).GetMethod(nameof(WebTools.EnumIslems)).MakeGenericMethod(item).Invoke(null, null); }
        return MvcHtmlString.Create(JsonConvert.SerializeObject(ret));
    }
}

.cshtml(我一般放在主布局的head标签下)侧

<script type="text/javascript">
      var _enums = @Html.Raw(Html.Enums());
      /*
      var _enums = { "DayOfWeekTR": { "Enum": { "pzr": 0, "pzts": 1, "sali": 2, "car": 3, "per": 4, "cuma": 5, "cmrts": 6 }, "Array": [{ "vl": 0, "tx": "Pazar" }, { "vl": 1, "tx": "Pazartesi" }, { "vl": 2, "tx": "Salı" }, { "vl": 3, "tx": "Çarşamba" }, { "vl": 4, "tx": "Perşembe" }, { "vl": 5, "tx": "Cuma" }, { "vl": 6, "tx": "Cumartesi" }] }, "DepoTipi": { "Enum": { "ana": 1, "sube": 2, "uretim": 3 } } }; the result should be like this! */
      (function () {
          let ob, rt, t = this;
          $.each(Object.keys(t), function (index, vs) {
              if (typeof t[vs].Desc !== 'function') {
                  t[vs].Desc = function (vl, tp) {
                      if (typeof t[vs].Array !== 'object' || (typeof tp === 'boolean' && !tp)) {
                          rt = '';
                          for (ob in t[vs].Enum) {
                              if (t[vs].Enum[ob] === vl) {
                                  rt = ob;
                                  break;
                              }
                          }
                          return rt;
                      }
                      else { return (t[vs].Array.find(x => x.vl === vl) || { tx: '' }).tx; }
                  };
              }
          });
      }).call(_enums);    
    </script>

示例

<script type="text/javascript">
var vl = _enums.DayOfWeekTR.Enum.pzr; //result 0;
var array = _enums.DayOfWeekTR.Array;
var desc = _enums.DayOfWeekTR.Desc(2); // result: 'Salı' if it returned description value
var tx = _enums.DayOfWeekTR.Desc(2, false) // result: 'sali' enum name
</script>

0
投票
public static class EnumHelper
{
    public static HtmlString EnumToString<T>() where T : Enum
    {
        Dictionary<int, string> enumDict = Enum.GetValues(typeof(T))
               .Cast<T>()
               .ToDictionary(e => Convert.ToInt32(e), e => e.ToString());
        
        return new HtmlString(JsonConvert.SerializeObject(enumDict));
    }

    public static HtmlString EnumToJsClass<T>() where T : Enum
    {
        Dictionary<int, string> enumDict = Enum.GetValues(typeof(T))
            .Cast<T>()
            .ToDictionary(e => Convert.ToInt32(e), e => e.ToString());

        StringBuilder js = new StringBuilder();
        js.AppendLine($"class {typeof(T).Name} {{");

        foreach (KeyValuePair<int, string> item in enumDict)
        {
            js.AppendLine($"static #_{item.Value} = {item.Key};");
        }

        foreach (KeyValuePair<int, string> item in enumDict)
        {
            js.AppendLine($"static get {item.Value}() {{ return this.#_{item.Value}; }}");
        }

        js.Append("}");

        return new HtmlString(js.ToString());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.