获取Enum在客户端显示

获取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名称查询,而不是整数。当新版本发布时,我会在这里回复。

+0

在调查此问题时,我发现尽管Enum元数据存在于/ Metadata API调用中,但它在Breeze的客户端丢弃。感谢Jay的更新。 – 2013-03-14 05:46:37

+1

Breeze v 1.2.1刚刚发布,枚举现在可以作为字符串查询,并且通过这种方式实现。 – 2013-03-14 09:32:37

+0

顺便提一下,我也在几分钟前更新了...;) 这个版本解决了这个问题,Thanx ... – 2013-03-14 09:41:31

这很容易在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; 
}; 

肮脏,肮脏的黑客,我知道......但是,这是我发现

解决
+0

恐怕对API返回调用没有影响。这可能是因为Breeze控制器处理API调用等... – 2013-03-13 14:58:41

+0

@万圣母,我更新了解决方案的答案当前Breeze.js版本 – whyleee 2013-03-13 21:48:50

+0

感谢修复,但似乎这个修复将不是必要的几天,我宁愿避免任何黑客...... :) – 2013-03-14 05:48:38