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

时间:2013-03-31 17:06:08

标签: knockout.js breeze durandal

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

我有一个下拉列表,其中列表是从Entity Framework Code First提供的枚举中填充的。这是模型服务器端:

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>

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

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:2)

你是对的,必须在客户端上为服务器上定义的枚举重复枚举定义是多余的。理想情况下,breeze元数据应包含构成Enum类型的各个枚举值。

不幸的是,我们尚未到达那里。但这是一个非常合理的功能。你能否把它添加到Breeze User Voice。我们非常重视这些建议,以确定下一步要使用哪些功能。

答案 1 :(得分:1)

在此期间,您可以创建全球&#34; enums&#34;来自您的元数据:

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

});

因此,如果您有一个名为&#34;状态&#34;的枚举,您现在可以调用一个全局对象:

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

这些也可以绑定到下拉列表

答案 2 :(得分:0)

这是一个你可以考虑的选项,虽然它根本不使用Breeze :-(,我还没有采用微风,所以不确定它是如何帮助我们的。

此示例使用标准WebAPI控制器将时区列表填充到淘汰赛V / VM上的下拉列表中。

控制器:

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

控制器的输出(对不起格式化,但它基本上是Id,名称对,很像你的类别列表):

  

[{Id:“Dateline Standard Time”,DisplayName:“(UTC-12:00)   International Date Line West“},{Id:”UTC-11“,DisplayName:   “(UTC-11:00)协调世界时间-11”},{Id:“夏威夷人   标准时间“,显示名称:”(UTC-10:00)夏威夷“},{Id:”阿拉斯加   标准时间“,显示名称:”(UTC-09:00)阿拉斯加“},{Id:”太平洋   标准时间(墨西哥)“,显示名称:”(UTC-08:00)Baja California“},   {Id:“太平洋标准时间”,DisplayName:“(UTC-08:00)太平洋时间   (美国和加拿大)“},{Id:”美国山地标准时间“,DisplayName:   “(UTC-07: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>

这为我提供了一个下拉列表,其中包含来自服务器的对象填充的表单。

答案 3 :(得分:0)

使用@JohnPapa的SPA课程中的一些概念,您是否可以按照以下方式在Breeze Controller上公开操作:

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

*编辑:已实现我使用过GetValues(会返回int值)而不是GetNames

然后在你的viewmodel(或datacontext服务)中:

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