下拉填充了由Breeze(服务器端)与Breeze提供的选项

Bro*_*ato 8 knockout.js breeze durandal

我用durandal/breeze开发了一个asp.net mvc解决方案.

我有一个下拉列表,其中列表是由实体框架代码优先提供的枚举填充的.这是模型服务器端:

public enum EnumCategory
{
    Cat1,
    Cat2,
    Cat3,
    Cat4
}
Run Code Online (Sandbox Code Playgroud)

这是使用此枚举的表:

public class Transport
{
    [Key]
    public int Id { get; set; }
    public EnumCategory Category { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题:如何检索枚举服务器端的这些值,以便能够填充我的下拉客户端?我是否必须手动创建一个新的数组客户端,如下所示:

 var categories = [
    { id: '' , description: '' },
    { id: 'Cat1', description: 'Category 1' },
    { id: 'Cat2', description: 'Category 2' },
    { id: 'Cat3', description: 'Category 3' },
    { id: 'Cat4', description: 'Category 4' }];
Run Code Online (Sandbox Code Playgroud)

我的视图显示此下拉列表,如下所示:

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

我不得不重新创建一个客户端值列表,因为我们已经有了服务器端的值列表.

任何的想法?

谢谢.

小智 1

作为同时的解决方法,您可以从元数据创建全局“枚举”,如下所示:

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

});
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个名为“Status”的枚举,那么您现在将拥有一个可以调用的全局对象:

var currentStatus = Status.Done; //returns the value as defined in the server side enum
Run Code Online (Sandbox Code Playgroud)

这些也可以绑定到下拉菜单