获取Enum在客户端显示
我很难理解如何将Enum值转换为相应的名称。我的模型如下:获取Enum在客户端显示
public class CatalogRule
{
public int ID { get; set; }
[Display(Name = "Catalog"), Required]
public int CatalogID { get; set; }
[Display(Name = "Item Rule"), Required]
public ItemType ItemRule { get; set; }
public string Items { get; set; }
[Display(Name = "Price Rule"), Required]
public PriceType PriceRule { get; set; }
[Display(Name = "Value"), Column(TypeName = "MONEY")]
public decimal PriceValue { get; set; }
[Display(Name = "Exclusive?")]
public bool Exclude { get; set; }
}
public enum ItemType
{
Catalog,
Category,
Group,
Item
}
public enum PriceType
{
Catalog,
Price_A,
Price_B,
Price_C
}
从.NET API的样本结果:
[
{
$id: "1",
$type: "XYZ.CMgr.Models.CatalogRule, XYZ.CMgr",
ID: 1,
CatalogID: 501981,
ItemRule: 0,
Items: "198",
PriceRule: 1,
PriceValue: 0.5,
Exclude: false
},
{
$id: "2",
$type: "XYZ.CMgr.Models.CatalogRule, XYZ.CMgr",
ID: 2,
CatalogID: 501981,
ItemRule: 2,
Items: "9899",
PriceRule: 2,
PriceValue: 10.45,
Exclude: false
}
]
在这个例子中
所以,我需要得到目录的结果[0] .ItemRule & 价格A结果[0] .PriceRule。我怎么能在BreezeJS中完成这个?
有将在接下来的几天里,其中一个新的版本出来我们“改变”微风的枚举行为(即打破关于枚举的现有代码)。在新版本中,枚举被序列化并通过它们的.NET名称查询,而不是整数。当新版本发布时,我会在这里回复。
这很容易在ASP.NET Web API中完成,因为它是默认JSON序列化程序(Json.NET)的开箱即用功能。
要查看字符串代替JSON枚举数,只是应用程序初始化过程中添加的StringEnumConverter
到JSON序列设置的实例:
var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
UPDATE:是的,你的权利,这是不是与微风帮.js文件。好吧,无论如何,你可以做一些小小的魔法来让枚举工作得像字符串(虽然新版本带有修复功能并没有发布)。
创建一个自定义ContextProvider
,它将元数据中的所有整数枚举值更新为字符串。那就是:
public class StringEnumEFContextProvider<T> : EFContextProvider<T>
where T : class, new()
{
protected override string BuildJsonMetadata()
{
XDocument xDoc;
if (Context is DbContext)
{
xDoc = GetCsdlFromDbContext(Context);
}
else
{
xDoc = GetCsdlFromObjectContext(Context);
}
var schemaNs = "http://schemas.microsoft.com/ado/2009/11/edm";
foreach (var enumType in xDoc.Descendants(XName.Get("EnumType", schemaNs)))
{
foreach (var member in enumType.Elements(XName.Get("Member", schemaNs)))
{
member.Attribute("Value").Value = member.Attribute("Name").Value;
}
}
return CsdlToJson(xDoc);
}
}
并在Web API控制器使用它,而不是EFContextProvider
:
private EFContextProvider<BreezeSampleContext> _contextProvider =
new StringEnumEFContextProvider<BreezeSampleContext>();
这很适合我目前的Breeze.js版本(1.1.3),虽然我还没有“吨检查其他场景中,如验证...
UPDATE:要解决验证,变化数据类型在微风枚举[分钟|调试]的.js,手动(DataType.fromEdmDataType
功能,dt = DataType.String;
为电子NUM)或应用程序初始化期间替换默认功能:
breeze.DataType.fromEdmDataType = function (typeName) {
var dt = null;
var parts = typeName.split(".");
if (parts.length > 1) {
var simpleName = parts[1];
if (simpleName === "image") {
// hack
dt = DataType.Byte;
} else if (parts.length == 2) {
dt = DataType.fromName(simpleName);
if (!dt) {
if (simpleName === "DateTimeOffset") {
dt = DataType.DateTime;
} else {
dt = DataType.Undefined;
}
}
} else {
// enum
dt = DataType.String; // THIS IS A FIX!
}
}
return dt;
};
肮脏,肮脏的黑客,我知道......但是,这是我发现
解决恐怕对API返回调用没有影响。这可能是因为Breeze控制器处理API调用等... – 2013-03-13 14:58:41
@万圣母,我更新了解决方案的答案当前Breeze.js版本 – whyleee 2013-03-13 21:48:50
感谢修复,但似乎这个修复将不是必要的几天,我宁愿避免任何黑客...... :) – 2013-03-14 05:48:38
在调查此问题时,我发现尽管Enum元数据存在于/ Metadata API调用中,但它在Breeze的客户端丢弃。感谢Jay的更新。 – 2013-03-14 05:46:37
Breeze v 1.2.1刚刚发布,枚举现在可以作为字符串查询,并且通过这种方式实现。 – 2013-03-14 09:32:37
顺便提一下,我也在几分钟前更新了...;) 这个版本解决了这个问题,Thanx ... – 2013-03-14 09:41:31