我有 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 文件并在其中使用。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 的情况。 如果您使用打字稿,我建议在打字稿中使用并行类,因为它们会在编译时提供更好的类型检查。
您可以通过简单的方式在javascript中获取Enum值
<script>
var aggregateFunctions= @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Enum.GetNames(typeof(Address.AggregateFunc))));
这里在aggregateFunctions 中获取枚举值数组
这是我使用的解决方案:
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"
我在自己的项目中使用它。枚举值,枚举名称,枚举描述,采用数组格式。使用时它提供了很大的自由度 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>
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());
}
}