2013-03-31 10 views
8

Sviluppo una soluzione asp.net in mvc con durandal/brezza.Menu a discesa riempito con opzioni fornite da un enum (lato server) con Breeze

Ho un menu a discesa in cui l'elenco è popolato da un Enum fornito da Entity Framework Code First. Ecco il lato server modello

public enum EnumCategory 
{ 
    Cat1, 
    Cat2, 
    Cat3, 
    Cat4 
} 

Ecco la tabella che utilizzano questo enum:

public class Transport 
{ 
    [Key] 
    public int Id { get; set; } 
    public EnumCategory Category { get; set; } 
    ... 
} 

La mia domanda: come recuperare questi valori di lato server enum per essere in grado di riempire il mio lato cliente dropdown? Devo creare un nuovo array manualmente lato client in questo modo:

var categories = [ 
    { id: '' , description: '' }, 
    { id: 'Cat1', description: 'Category 1' }, 
    { id: 'Cat2', description: 'Category 2' }, 
    { id: 'Cat3', description: 'Category 3' }, 
    { id: 'Cat4', description: 'Category 4' }]; 

mia vista mostra questa discesa in questo modo:

<select data-bind="options: $root.categories, 
        optionsText: 'description', 
        optionsValue: 'id', 
        value: category, 
        validationOptions: { errorElementClass: 'input-validation-error' }, 
        valueUpdate: 'afterkeydown'"> 
</select> 

sembra ridondante per me avere a ricreare un elenco di clienti valori lato perché abbiamo già questo elenco di valori lato server.

Qualche idea?

Grazie.

risposta

1

per aggirare il problema, nel frattempo, è possibile creare enu globale" ms" dai vostri metadati come questo:

manager.fetchMetadata() 
    .then(function (data) { 

     // extract all enums als global objects 
     ko.utils.arrayForEach(data.schema.enumType, function (c) { 
      window[c.name] = {}; 
      ko.utils.arrayForEach(c.member, function (m) { 
       window[c.name][m.name] = m.value; 
      }); 
     }); 

}); 

Quindi, se si ha un enum chiamato 'Stato', si sarebbe ora avere un oggetto globale che è possibile chiamare:

var currentStatus = Status.Done; //returns the value as defined in the server side enum 

Questi possono poi essere anche vincolato a dropdowns

0

Qui è un'opzione che si può considerare, anche se non fa uso di Breeze a tutti :-(, non ho ancora adottato brezza quindi non so come si può aiutare noi qui.

Questo esempio utilizza uno standard controller WebAPI popolare un elenco di fusi orari in un elenco a discesa su un ko V/VM

il controllore:.

public class LookupController : ApiController 
{ 
    public IEnumerable GetTimezones() 
    { 
     return TimeZoneInfo.GetSystemTimeZones().Select(tz => new {tz.Id, tz.DisplayName}).ToArray(); 
    } 
} 

l'uscita dal controller (scusate per la formattazione, ma è fondamentalmente Id, Nome coppie, proprio come la lista delle categorie):

[{Id: "Dateline Standard Time", DisplayName: "(GMT-12: 00) Data Internazionale linea West"}, {Id: "UTC-11", DisplayName: "(UTC- 11:00) Tempo universale coordinato-11 "}, {Id:" Hawaiian Standard Time ", DisplayName:" (UTC-10: 00) Hawaii "}, {Id:" Alaskan Standard Time ", DisplayName: "(UTC-09: 00) Alaska"}, {Id: "Pacific Tempo standard (Messico)", DisplayName: "(UTC-08: 00) Baja California"}, {Id: "Pacific Standard Time", DisplayName: "(UTC-08: 00) Pacific Time (Stati Uniti & Canada)"}, {Id: "Tempo standard US Mountain", DisplayName: "(UTC-07: 00) Arizona"}, .... ecc

Snippet dal modello di vista:

$.ajax({ 
     url: '/api/lookup/timezones', 
     context: this 
    }).done(function(result) { 
     // load timezones 
     timezones(result); // timezones is a ko.observableArray 
     // set the default time zone 
     timezone('Eastern Standard Time'); // timezone is a ko.observable 
    }); 

La vista:

<select class="span6" data-bind="options: timezones, optionsText: 'DisplayName', optionsValue: 'Id', value: timezone"></select> 

Questo mi dà una discesa sulla mia forma popolato da oggetti dal server.

+0

L'esempio che mi dai è in particolare quando l'elenco di valori proviene da un database. La mia domanda riguarda il recupero dell'elenco di valori da un enum (lato server). Questo non è lo stesso approccio. Non voglio memorizzare valori diversi nel mio db. Grazie comunque. – Bronzato

+0

Non è necessario mantenere le descrizioni enum nel db. Aggiungi DescrizioneAttributo a ciascun valore enum e quindi crea una matrice di coppie id e descrizione sul server. Utilizzare Enum.GetValues ​​() e Attribute.GetCustomAttributes() per ottenere l'id e la descrizione. – pawel

+0

Ciao Bronzato, sto suggerendo di definire Enum una volta sul server e poi accedervi sul client utilizzando un controller API. Questo è effettivamente quello che sto facendo per compilare un elenco di fusi orari sul client. L'elenco dei fusi orari è alimentato dalla classe .NET TimeZoneInfo, che è simile al tuo scenario enum, per quanto generato dal codice e non da un DB. –

2

Hai ragione, è ridondante dover ripetere la definizione enum sul client per un enum definito sul server.Idealmente i metadati di brezza dovrebbero includere i singoli valori enum che costituiscono un tipo Enum.

Purtroppo, non siamo ancora arrivati. Ma questa è una caratteristica molto ragionevole. Potresti per favore aggiungerlo allo Breeze User Voice. Prendiamo molto seriamente questi suggerimenti nel determinare quali funzioni lavorare in futuro.

0

Usando alcuni dei concetti da corsi SPA @JohnPapa s', non si poteva esporre un'azione sul Controller Breeze come segue:

[HttpGet] 
    public object Categories() 
    { 
     var categories = Enum.GetNames(typeof(EnumCategory) 
     return categories; 
    } 

* EDIT: GetValues ​​sono reso conto che avevo usato (che sarebbe tornato il int valori), piuttosto che GetNames

Poi, nel tuo ViewModel (o un servizio di DataContext):

var categories = EntityQuery.from('Categories') 
      .using(manager).execute() 
+0

DISCLAIMER: Si prega di notare che questo è concettuale e assolutamente non testato! : D –

Problemi correlati