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

标签 javascript c# enums

我有像这样的 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# 枚举列表的最佳和正确方法是什么?

最佳答案

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

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

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

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

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

引用this article如果您想了解有关 javascript 语法的更多信息

编辑:

如果你不想在JS文件中明确指定它们,那么你可以写扩展方法as specified in this article .这会将 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 时适用。 如果您使用的是 typescript ,我建议您在 typescript 中使用并行类,因为它们会在编译时提供更好的类型检查。

关于javascript - 如何将 C# 枚举列表传递和使用到 Javascript 文件并在其中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167188/

相关文章:

java - 如何生成具有给定数量的属性的给定数量的随机对象?

javascript - 每次我尝试使用此方法打印 pdf 时,它总是会生成空白 pdf

C#多线程自增

c++ - 为什么在 `template` 类的枚举上使用声明不起作用?

java - 如何在java中的单例(Enum风格)上调用私有(private)方法?

c# - Entity Framework 核心 : Get a List of All the Tables

javascript - AJAX、PHP、SQL newsfeed 每次都会出错

javascript - jquery 按类选择然后匹配值

javascript - 从数据库获取多个位置并显示到 Google map

c# - Git 提交并推送二进制文件,但不保留历史记录