我有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#枚举列表的最佳和正确方法是什么?
答案 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中获取枚举值数组