9

我用 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

4 回答 4

2

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

不幸的是,我们还没有到达那里。但这是一个非常合理的功能。您能否将其添加到微风用户语音中。我们非常重视这些建议,以决定接下来要开发哪些功能。

于 2013-04-01T18:45:01.927 回答
1

这是您可以考虑的一个选项,尽管它根本不使用 Breeze :-(,我还没有采用 Breeze,所以不确定它如何在这里帮助我们。

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

控制器:

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

控制器的输出(抱歉格式化,但它基本上是 Id、Name 对,很像您的类别列表):

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

这给了我一个由服务器对象填充的表单的下拉列表。

于 2013-04-01T09:10:05.683 回答
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;
            });
        });

});

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

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

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

于 2014-01-23T17:30:21.227 回答
0

使用@JohnPapa 的 SPA 课程中的一些概念,您能否在 Breeze 控制器上公开操作,如下所示:

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

*编辑:意识到我使用了 GetValues(它将返回 int 值)而不是 GetNames

然后在您的视图模型(或数据上下文服务)中:

var categories = EntityQuery.from('Categories')
           .using(manager).execute()
于 2013-07-18T03:37:23.743 回答