gpt4 book ai didi

Breeze js : overriding displayname

转载 作者:行者123 更新时间:2023-12-04 09:18:56 24 4
gpt4 key购买 nike

我正在自定义验证消息。使用 messageTemplates 属性可以正常工作。但是它使用 %displayName% 来呈现属性的名称,我不知道如何覆盖这个值?有没有办法做到这一点?

最佳答案

我也想这样做,但我想使用我的 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();
}

然后我在元数据加载后添加了一些 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"]);
});

我正在使用 angular,所以如果你不是,你可以忽略 angular 的东西,可能会得到这个想法。这似乎工作得很好。将此扩展到其他模型属性以及正则表达式验证属性应该很容易。我可能会在接下来的工作。

仅供引用,其中一些代码没有优化,可能可以重构,稍微修饰一下,但我刚刚让它工作并认为我会分享。如果有人对更好的方法有任何建议,请告诉我。希望 Breeze 将来允许以更受支持的方式扩展元数据。这确实有点像黑客。

关于 Breeze js : overriding displayname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16733251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com