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

Ste*_*ann 2 javascript c# enums

我有 C# 枚举列表类,例如,

namespace MyProject.MyEnumListClass
{
 public enum MyEnum
  {
    ValueOne,
    ValueTwo,
    ValueThree,
    ValueFour,
    ValueFive,
    ValueSix
   }
 }
Run Code Online (Sandbox Code Playgroud)

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

@using MyProject.MyEnumListClass

<script>
  .....

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

 .....
</script>
Run Code Online (Sandbox Code Playgroud)

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

Man*_*ari 5

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

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

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

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

var SizeEnum = {
  SMALL: 1,
  MEDIUM: 2,
  LARGE: 3,
};
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<script>
    var assetStatusEnum = @(EnumHelper.EnumToString<SizeEnum>())
</script>
Run Code Online (Sandbox Code Playgroud)

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