Json Breezejs与Tout元数据的命名约定
我一直在阅读答案和Breeze文档,挖掘代码,但我就是做不到这一点 我和NancyFx有一个Web服务,许多Web应用程序都使用它,我决定采用json中的camelCase约定Json Breezejs与Tout元数据的命名约定,json,breeze,Json,Breeze,我一直在阅读答案和Breeze文档,挖掘代码,但我就是做不到这一点 我和NancyFx有一个Web服务,许多Web应用程序都使用它,我决定采用json中的camelCase约定 '[{"id":"0", "slug":"my-slug","name":"Slug"}]' 现在我正在研究breeze,我想使用oData查询,我正在使用Linq2Rest,所以我的第一个尝试模块是这样的 private dynamic GetFoos(dynamic p) { //Converting th
'[{"id":"0", "slug":"my-slug","name":"Slug"}]'
现在我正在研究breeze,我想使用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');
我这样质疑我的服务
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');
这就是一切都崩溃的地方,首先因为我在.NET中的类Foo的属性声明如下
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);
这是可行的,但是数据。结果不绑定到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
};
}
});
建议
谢谢
编辑
现在我正在使用breezebreeze.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”}]
中转换,然后我还不知道在哪里,由于我使用的namingConvention,Breeze将PascalCase中的属性映射到camelCase
问题是这个
var query = breeze.EntityQuery.from('foos')
.using(manager)
.where('slug', '==', slug)
.toType('Foo');
你能发布你的自定义NamingConvention实现吗?我使用camelCase默认NamingConvention,我只是使用jsonresultsAdapter向json添加属性,然后breeze进行映射……breeze NamingConvention只应用于属性名,而不是资源名。因此,您的查询应该是“from('Foos')”而不是“from('Foos')。我想我无法解释自己。我知道namingConvention只用于属性名称,而不是资源名称。from('Foos'))
是正确的,它正在工作,因为这就是我在服务器上命名路由的方式。我遇到的问题是breeze的自动映射。我想用PascalCase发送查询,我想用camelCase中的Json构建我的对象。这是我不能做的。谢谢。。。