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

时间:2019-01-13 08:19:45

标签: javascript c# enums

我有C#枚举列表类,

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

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

@using MyProject.MyEnumListClass

<script>
  .....

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

 .....
</script>

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果您使用纯JavaScript,

JS代码将类似于以下内容:

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

如果需要有关JavaScript语法的更多信息,请参考this article

编辑:

如果您不想在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));
    }
}

然后可以在剃须刀文件中使用它,如下所示。由于这是一个脚本,因此该变量应该在您的JS文件中可用。

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

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

答案 1 :(得分:0)

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

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

此处的gregationFunctions中获取枚举值数组