2013-03-31 33 views
8

我開發了一個帶有durandal /微風的asp.net mvc解決方案。下拉列表中填充了enum(服務器端)提供的選項,Breeze

我有一個從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 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; 
      }); 
     }); 

}); 

所以,如果你有稱爲枚舉‘狀態’,你現在有一個全球性的對象,您可以撥打:

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

這些然後也可以綁定到下拉列表

0

這裏是你可以考慮的選擇,儘管它根本不,我還沒有采取清風又是那麼不知道如何能在這裏幫助我們所有:-(使用微風。

此示例使用標準的WebAPI控制器來填充時區列表到一個下拉列表中的淘汰賽V/VM

控制器:

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- 11:00)協調世界時-11「},{Id:」Hawaiian Standard Time「,DisplayName:」(UTC-10:00)Hawaii「},{Id:」Alaskan Standard Time「,DisplayName: 「(UTC-09:00)Alaska」},{Id:「Pacific Standard Time(Mexico)」,DisplayName:「(UTC-08:00)Baja California」}, {Id:「Pacific Standard Time」,亞利桑那州「},{Id:」美國山區標準時間「,顯示名稱:」(UTC-08:00)太平洋時間 (美國&加拿大) ....等從視圖模型

段:

$.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

您給我的示例具體是當值的列表來自數據庫時。我的問題是關於從枚舉(服務器端)檢索值列表。這是不一樣的方法。我不想在我的數據庫中存儲不同的值。不管怎麼說,還是要謝謝你。 – Bronzato

+0

您不必在數據庫中保留枚舉描述。將Description屬性添加到每個枚舉值,然後在服務器上構建一組id和description對。使用Enum.GetValues()和Attribute.GetCustomAttributes()來獲取標識和描述。 – pawel

+0

您好Bronzato,我建議您在服務器上定義一次Enum,然後使用API​​控制器在客戶端上訪問它。 這就是我正在做的事情來填充客戶端上的時區列表。時區的列表由.NET TimeZoneInfo類提供支持,這與您的枚舉場景類似,只要它是從代碼而不是數據庫生成的。 –

2

你是對的,在客戶機上重複枚舉定義在服務器上定義的枚舉是多餘的。理想情況下,breeze元數據應該包含組成Enum類型的單個枚舉值。

不幸的是,我們還沒有到那裏。但這是一個非常合理的功能。你可以把它添加到Breeze User Voice。我們非常重視這些建議,以確定下一步要開展哪些功能。

0

使用一些從@JohnPapa的SPA療程的概念,你能不能在你的微風控制器暴露的動作如下:

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

*編輯:意識到我必須使用的GetValues(這將返回INT值),而不是GetNames

然後在您的視圖模型(或一個DataContext服務):

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

免責聲明:請注意,這是概念性的,完全沒有經過測試! :d –