2013-03-31 17 views
8

durandal/breezeを使用してasp.net mvcソリューションを開発します。Breezeでenum(サーバー側)が提供するオプションでドロップダウン

私は、リストがEntity Framework Code Firstによって提供されるEnumから読み込まれるドロップダウンを持っています。ここで

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

この列挙型を使用した表である:ここではモデルのサーバ側は、

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

私の質問:埋めることができるように列挙型のサーバ側のこれらの値を取得する方法私のドロップダウンクライアント側?

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

マイビュー表示このように、このドロップダウンは:

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

値クライアントのリストを再作成する必要が私には冗長なようだ私はこのような新しい配列手動でクライアント側を作成する必要がありますか私たちは既にこの値のリストをサーバー側に持っているからです。

ありがとうございました。ここで

答えて

1

その間に回避策として、あなたは世界の「ENUを作成することができます

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

これらは、その後もすることができ:MS:ステータス 『」あなたのメタデータから、このようなあなたが呼ばれる列挙型を持っていた場合

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

}); 

だから』、あなたは今、あなたが呼び出すことができるグローバルオブジェクトを持っているでしょうドロップダウンに束縛されます

0

が、それは:-(全くブリーズを使用しませんが、私はそれがここで私たちを支援することができますどのようにわからない、まだ風を採用していない、あなたが考えることができますオプションです。

このサンプルでは、​​標準を使用していますノックアウトV/VM上のドロップダウンリストにタイムゾーンのリストを移入するWebAPIのコントローラ

コントローラ:。

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

出力フォーマットのため申し訳ありませんコントローラ(からそれは基本的にID、名前ですペア、あなたのカテゴリリストによく似ています):

[{ID: "日付変更線標準時"、表示名: "(UTC-12:00) 日付変更線ウエスト"}、{ID: "UTC-11"、表示名: 「(UTC- (ID: "Alaskan 標準時"、DisplayName: "11:00)協定世界時11"}、{ID: "ハワイ語 標準時"、ディスプレイ名: "(UTC-10:00)ハワイ"}、 (UTC-08:00)Baja California」}、 {Id: "太平洋標準時"、(UTC-09:00)アラスカ "}、{Id:" Pacific Standard Time " (UTC-08:00)太平洋標準時 (US &カナダ) "}、{ID:" US Mountain Standard Time "、ディスプレイネーム: "(UTC-07:00)Arizona "}、 ....など

スニペットビューモデルから:

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

ビュー:

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

は、これは私のサーバーからのオブジェクトによって移入私のフォーム上のドロップダウンを提供します。

+0

あなたが私に与える例は、特に値のリストがデータベースから来た場合です。私の質問は、列挙型(サーバー側)から値のリストを取得することです。これは同じアプローチではありません。私は私のdbに異なる値を格納したくない。とにかくありがとう。 – Bronzato

+0

dbにenumの説明を保持する必要はありません。各enum値にDescriptionAttributeを追加し、サーバー上にIDと説明のペアの配列を作成します。 IDと説明を取得するには、Enum.GetValues()とAttribute.GetCustomAttributes()を使用します。 – pawel

+0

こんにちはブロンザート、私は、サーバー上であなたのEnumを一度定義し、APIコントローラを使用してクライアント上でアクセスすることをお勧めします。 これは、クライアント上でタイムゾーンのリストを設定するために効果的に行っていることです。タイムゾーンのリストは.NET TimeZoneInfoクラスによって提供されます。これは、enumシナリオのようなもので、コードではなくDBから生成されます。 –

2

サーバー上で定義された列挙型のクライアントで列挙型定義を繰り返す必要があるのは妥当です。理想的には、風のメタデータには、列挙型を構成する個々の列挙型の値を含める必要があります。

残念ながら、まだ届いていません。しかし、これは非常に合理的な機能です。 Breeze User Voiceに追加してください。私たちは、これらの提案を非常に真剣に次の作業を行う機能を決定することにします。 @JohnPapaのSPAコースからの概念のいくつかを使用して

0

、次のようにあなたのブリーズコントローラのアクションを公開しませんでした:

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

を* EDIT:実現私は戻ってくるでgetValues(使用していましたint型の値)よりもむしろによりgetNames

あなたのviewmodelで次に

(またはDataContextのサービス):

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

免責事項:これは概念的であり、完全にテストされていないことにご注意ください! :D –

関連する問題