Je suis en train de personnaliser les messages de validation. Cela fonctionne bien en utilisant la propriété Messageemplates. Cependant, il utilise% displayName% pour rendre le nom de la propriété et je ne peux pas savoir comment remplacer cette valeur? Y'a-t'il un quelconque moyen d'y arriver ? p>
7 Réponses :
Ceci n'est pas encore bien documenté, mais vous pouvez simplement définir la propriété "DisplayName" sur n'importe quelle DataProperty, ce qui remplacera le nom d'affichage autogénétérisé et sera utilisé pour tous les messages de validation de cette propriété. Donc, aussi, veuillez vous reporter à "Personnaliser les modèles de message" au bas de cette page: Validation Breise P> P>
Comme je l'ai dit, cela ne pouvait que personnaliser le message que je fais déjà. Mais comment puis-je remplacer le nom de l'affichage de la propriété? Si j'ai une propriété appelée producttitle, j'aimerais% DisplayName% pour afficher le «titre du produit» par exemple.
Mon erreur, j'aurais dû lire votre message plus attentivement. J'ai mis à jour la réponse ci-dessus.
Je voulais faire cela aussi mais je voulais utiliser l'attribut [displayName] de mon modèle EF. Je ne pouvais trouver personne qui avait un exemple de faire cela après avoir trouvé une manière dont je pensais que je pensais partager.
Premièrement, j'ai prolongé les métadonnées de mon BreezEcontroller: P>
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"]); });
En regardant http: //www.breezejs. Com / Sites / Tous / APIDOCS / Fichiers / A40_ELTYTYMETADATA.JS.HTML # L1452 , P>
pourrait-il être amélioré en renommant la valeur "Nom" existante à Nameonserver (pour satisfaire l'appel GetDataProperty) et en insérant la valeur d'affichageAttribute comme "nom"? p>
Après la demande de suggestions de JPCoder, voici ma partie de serveur légèrement améliorée:
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); IEnumerable<JToken> metaProps = null; if (entityType["property"].Type == JTokenType.Object) metaProps = new[] { entityType["property"] }; else metaProps = entityType["property"].AsEnumerable(); var props = from p in metaProps let pname = p["name"].ToString() let prop = t.GetProperties().SingleOrDefault(prop => prop.Name == pname) where prop != null from attr in prop.CustomAttributes where attr.AttributeType.Name == "DisplayNameAttribute" select new { Prop = p, DisplayName = ((DisplayNameAttribute)Attribute.GetCustomAttribute(prop, typeof(DisplayNameAttribute))).DisplayName }; foreach (var p in props) p.Prop["displayName"] = p.DisplayName; }
Un changement nécessaire sur le code du serveur est que, si vos classes de modèle sont dans différents assemblages, vous ne pouvez pas utiliser
JObject metadata = JObject.Parse(UnitOfWork.Metadata()); string EFNameSpace = metadata["schema"]["namespace"].ToString(); string typeNameSpaces = metadata["schema"]["cSpaceOSpaceMapping"].ToString(); typeNameSpaces = "{" + typeNameSpaces.Replace("],[", "]|[").Replace("[", "").Replace("]", "").Replace(",", ":").Replace("|", ",") + "}"; JObject jTypeNameSpaces = JObject.Parse(typeNameSpaces); foreach (var entityType in metadata["schema"]["entityType"]) { string typeName = entityType["name"].ToString(); string defaultTypeNameSpace = EFNameSpace + "." + typeName; string entityTypeNameSpace = jTypeNameSpaces[defaultTypeNameSpace].ToString(); Type t = BuildManager.GetType(entityTypeNameSpace, false); IEnumerable<JToken> metaProps = null; if (entityType["property"].Type == JTokenType.Object) metaProps = new[] { entityType["property"] }; else metaProps = entityType["property"].AsEnumerable(); var props = from p in metaProps let pname = p["name"].ToString() let prop = t.GetProperties().SingleOrDefault(prop => prop.Name == pname) where prop != null from attr in prop.CustomAttributes where attr.AttributeType.Name == "DisplayNameAttribute" select new { Prop = p, DisplayName = ((DisplayNameAttribute)Attribute.GetCustomAttribute(prop, typeof(DisplayNameAttribute))).DisplayName }; foreach (var p in props) { p.Prop["displayName"] = p.DisplayName; } }
JObject metadata = JObject.Parse(this._context.Metadata()); string EFNameSpace = metadata["schema"]["namespace"].ToString(); string typeNameSpaces = metadata["schema"]["cSpaceOSpaceMapping"].ToString(); typeNameSpaces = "{" + typeNameSpaces.Replace("],[", "]|[").Replace("[", "").Replace("]", "").Replace(",", ":").Replace("|", ",") + "}"; JObject jTypeNameSpaces = JObject.Parse(typeNameSpaces); foreach (var entityType in metadata["schema"]["entityType"]) { string typeName = entityType["name"].ToString(); string defaultTypeNameSpace = EFNameSpace + "." + typeName; string entityTypeNameSpace = jTypeNameSpaces[defaultTypeNameSpace].ToString(); Type t = BuildManager.GetType(entityTypeNameSpace, false); IEnumerable<JToken> metaProps = null; if (entityType["property"].Type == JTokenType.Object) metaProps = new[] { entityType["property"] }; else metaProps = entityType["property"].AsEnumerable(); var props = from p in metaProps let pname = p["name"].ToString() let prop = t.GetProperties().SingleOrDefault(prop => prop.Name == pname) where prop != null from attr in prop.CustomAttributes where attr.AttributeType.Name == "DisplayAttribute" select new { Prop = p, DisplayName = ((DisplayAttribute)Attribute.GetCustomAttribute(prop, typeof(DisplayAttribute))).Name }; foreach (var p in props) { p.Prop["displayName"] = p.DisplayName; } } return metadata.ToString();
Bien que ce code puisse répondre à la question, il serait préférable d'inclure certains contexte i>, expliquant comment i> Ça fonctionne et quand i> à l'utiliser. Les réponses du code seulement ne sont pas utiles à long terme.
Améliorer la réponse de JPCoder ...
Pour moi, la plupart de mes modifications de mon nom d'affichage devaient remplacer "PascalcaseFieldName" ou "CamelcaseFieldName" avec "Nom de champ supérieur". Donc, plutôt que de définir tous les propriétés DisplayName sur le serveur, j'ai appliqué une fonction par défaut pour définir displayName. P>
Le résultat final était beaucoup moins d'annotation EF requise. Mon type dossueux est: p>