我一直在阅读答案和Breeze文档,深入研究代码,但我无法完成这项工作。
我使用NancyFx的WebService已被许多webapps使用,我决定在json中使用camelCase的约定。
'[{"id":"0", "slug":"my-slug","name":"Slug"}]'
现在我正在寻找微风,我想使用oData查询,我使用Linq2Rest,所以我的第一个尝试模块是这样的..
private dynamic GetFoos(dynamic p)
{
//Converting the request params to NameValueCollection to be used by
//extensionmethod Filter of Linq2Rest
var nvc = this.BuildNameValueCollection();
var institutions = Repository.Get();
return Response.AsJson(institutions.Filter(nvc));
}
当我做
这样的事情时,这就像一个魅力 http://foo.com/foos$filter=Slug%20eq%20my-slug
好的,现在让我们玩Breeze ....所以我手工制作我的元数据,我就是这样的
function addFooModel() {
addType({
name: 'Foo',
dataProperties: {
id : { type : ID },
name : { nullOk: false },
slug : { nullOk: false },
}
});
};
我像这样查询我的服务
var query = breeze.EntityQuery.from('foos')
.using(manager)
.where('slug', '==', slug)
.toType('Foo');
所以这就是所有内容都破解的地方,首先是因为我的类Foo的.NET中的属性被声明为这样......
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public string Slug {get; set;}
}
所以由Breeze构建的url是http://foo.com/foos$filter=slug%20eq%20my-slug
,因为我的属性是PascalCase,Linq2Rest说noupe,没有slug属性。
如果我声明breeze.NamingConvention.camelCase.setAsDefault();
url是正确的但数据没有绑定,因为它期望PascalCase中的json但返回的json是在camelcase中
我试图创建我的namingConvention,在dataProperty上设置nameOnServer,创建一个jsonResultAdapter,但我无法使它工作....
我知道我可以做到这一点
var query = breeze.EntityQuery.from('foos')
.using(manager)
.where('Slug', '==', slug);
这可行,但data.results
并未绑定到Foo模型....
有没有办法从微风中做到这一点:
在PascalCase中创建url,然后在CamelCase中解析json。
我用jsonResultAdapter做了这个解决方法,但我不喜欢它
var jsonResultsAdapter = new breeze.JsonResultsAdapter({
name: "fooAdapter",
extractResults: function(json) {
return json.results;
},
visitNode: function(node, mappingContext, nodeContext) {
for (var key in node){
node[key.substr(0, 1).toUpperCase() + key.substr(1)] = node[key];
}
return {
entityType: mappingContext.query.resultType
};
}
});
...建议
谢谢!
EDIT。
现在我使用了微风breeze.NamingConvention.camelCase.setAsDefault();
附带的camelCase配置我的模型的属性在camelCase中,而我使用的jsonResultsAdapter就是这个......
var jsonResultsAdapter = new breeze.JsonResultsAdapter({
name: "fooAdapter",
extractResults: function(json) {
return json.results;
},
visitNode: function(node, mappingContext, nodeContext) {
for (var key in node){
node[key.substr(0, 1).toUpperCase() + key.substr(1)] = node[key];
}
return {
entityType: mappingContext.query.resultType
};
}
});
我在节点中添加相同属性但在PascalCase中。如果服务器在适配器之后服务此json '[{"id":"0", "slug":"my-slug","name":"Slug"}]'
节点转换到'[{"id":"0", "slug":"my-slug","name":"Slug", "Id":"0", "Slug":"my-slug","Name":"Slug"}]'
然后我不知道在哪里,Breeze将PascalCase中的属性映射到camelCase,因为我指定了#&## 39;使用。
查询就是这个
var query = breeze.EntityQuery.from('foos')
.using(manager)
.where('slug', '==', slug)
.toType('Foo');