Breezejs命名约定与元数据

时间:2014-03-31 20:34:02

标签: json breeze

我一直在阅读答案和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');

0 个答案:

没有答案