2013-03-12 23 views
9

Mam trudności ze zrozumieniem, jak przekonwertować wartość wyliczenia na odpowiadającą jej nazwę. Mój model jest następujący:Uzyskiwanie wyliczeń do wyświetlania po stronie klienta

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 
} 

Wynik próbki z .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 
    } 
] 

więc w tym przykładzie, muszę dostać Katalog na wyniki [0] .ItemRule & cena A dla wyników [0] .PriceRule. Jak mogę to osiągnąć w BreezeJS?

Odpowiedz

4

Nie będzie nowe wydanie w ciągu najbliższych kilku dni, gdy "zmieniamy" zachowanie enum breeze (np. zerwanie istniejącego kodu w odniesieniu do enums). W nowym wydaniu wyliczenia są serializowane i sprawdzane przez ich nazwy .NET zamiast jako liczby całkowite. Opublikuję tutaj, gdy nowe wydanie zostanie wydane.

+0

Podczas badania tego problemu odkryłem, że chociaż metadane Enum były obecne w wywołaniu API '/ Metadata', zostały odrzucone po stronie klienta przez Breeze. Dzięki za aktualizację Jay. –

+1

Breeze v 1.2.1 został właśnie wydany, a wyliczenia są teraz przetwarzane jako łańcuchy znaków i tak samo zmaterializowane. –

+0

Nawiasem mówiąc, zaktualizowałem też kilka minut temu ...;) Ta wersja rozwiązuje problem, Thanx ... –

7

Jest to łatwe do zrobienia w ASP.NET Web API, ponieważ jest to funkcja domyślna w domyślnym serializatorze JSON (Json.NET).

Aby zobaczyć struny zamiast liczb enum w JSON, wystarczy dodać instancję StringEnumConverter do ustawień serializatora JSON podczas aplikacji w init:

var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
jsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 

UPDATE: Tak, masz rację, to nie jest pomoc z Breeze .js. Ok, możesz zrobić trochę magii, aby wyliczenia działały jak ciągi (podczas gdy nowa wersja z poprawką nie została wydana).

Utwórz niestandardową ContextProvider, która aktualizuje wszystkie wartości całkowite wyliczenia w metadanych na ciągi. Oto ona:

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); 
    } 
} 

i używać go zamiast EFContextProvider w Strona Internetowej kontrolerów API:

private EFContextProvider<BreezeSampleContext> _contextProvider = 
     new StringEnumEFContextProvider<BreezeSampleContext>(); 

Działa to dobrze dla mnie z aktualnej wersji (1.1.3) Breeze.js, chociaż Haven „t sprawdzane inne scenariusze, jak walidacji ...

UPDATE:. Aby rozwiązać walidacji, typ danych o teksty stałe zmiany w wietrze [min | debug] Js ręcznie (DataType.fromEdmDataType funkcji, dt = DataType.String; dla e num) lub zastąpić domyślną funkcję podczas aplikacji w init:

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; 
}; 

Brudne, brudne hacks, wiem ... Ale to rozwiązanie znalazłem

+0

Obawiam się, że nie miało to wpływu na połączenie zwrotne API. Może tak być dlatego, że kontroler Breeze obsługuje wywołania API i takie ... –

+0

@ Van Dame, zaktualizowałem odpowiedź za pomocą rozwiązania dla obecnej wersji Breeze.js – whyleee

+0

Dzięki za poprawki, ale wygląda na to, że ta poprawka nie będzie konieczna w kilka dni i wolałbym unikać jakichkolwiek hacków ... :) –

Powiązane problemy