我使用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>
我不得不重新创建一个客户端值列表,因为我们已经有了服务器端的值列表。
有什么想法吗?
感谢。
答案 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()