breezejs:覆盖displayname

Sam*_*Sam 7 breeze

我正在定制验证消息.它使用messageTemplates属性工作正常.但是它使用%displayName%来呈现属性的名称,我无法找到如何覆盖此值?反正有吗?

jpc*_*der 13

我也想这样做,但我想使用我的EF模型中的[DisplayName]属性.在我找到一种我认为可以分享的方式后,我找不到任何有这样做的例子的人.

首先,我扩展了从BreezeController返回的元数据:

[HttpGet]
public string Metadata()
{
    // Extend metadata with extra attributes
    JObject metadata = JObject.Parse(contextProvider.Metadata());
    string nameSpace = metadata["schema"]["namespace"].ToString();
    foreach (var entityType in metadata["schema"]["entityType"])
    {
        string typeName = entityType["name"].ToString();
        Type t = Type.GetType(nameSpace + "." + typeName);
        foreach (var prop in t.GetProperties())
        {
            foreach (var attr in prop.CustomAttributes)
            {
                string name = attr.GetType().Name;
                foreach (var p in entityType["property"])
                {
                    if (prop.Name == p["name"].ToString()) {
                        if (attr.AttributeType.Name == "DisplayNameAttribute") {
                            DisplayNameAttribute a = (DisplayNameAttribute)Attribute.GetCustomAttribute(prop, typeof(DisplayNameAttribute));
                            p["displayName"] = a.DisplayName;
                            break;
                        }
                    }
                }
            }
        }
    }

    return metadata.ToString();
}
Run Code Online (Sandbox Code Playgroud)

然后我在元数据加载后添加了一些小的javascript来从Breeze想要找到它们的扩充元数据中戳出显示名称.

manager.fetchMetadata().then(function (md) {
    angular.forEach(md.schema.entityType, function (et) {
        var etype = manager.metadataStore.getEntityType(et.name);
        angular.forEach(et.property, function (p) {
            var prop = etype.getProperty(p.name);
            prop.displayName = p.displayName;
        });
    });

    console.log("starting app");
    angular.bootstrap($("#app"), ["app"]);
});
Run Code Online (Sandbox Code Playgroud)

我正在使用角度,所以如果你不是你可以忽略角度的东西,可能会得到这个想法.这似乎工作得很好.将其扩展到其他模型属性以及RegularExpression验证属性应该非常容易.我可能会继续努力.

仅供参考,其中一些代码没有经过优化,可能会被重构,有点漂亮,但我只是让它工作并认为我会分享.如果有人有任何更好的建议让我知道.希望Breeze将来允许以更受支持的方式扩展元数据.这似乎有点像黑客.


Jay*_*and 7

这不是很好的文档,但您可以在任何dataProperty上设置'displayName'属性,这将覆盖自动生成的显示名称,并将用于此属性的所有验证消息.所以

 var custType = myEntityManager.metadataStore.getEntityType("Customer");
 var dp = custType.getProperty("companyName");
 dp.displayName = "My custom display name";
Run Code Online (Sandbox Code Playgroud)

另外,请参阅本页底部的"自定义消息模板":Breeze Validation