7
votes

Breifejs: DisplayName primordial

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 ?


0 commentaires

7 Réponses :


7
votes

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, xxx

aussi, veuillez vous reporter à "Personnaliser les modèles de message" au bas de cette page: Validation Breise


2 commentaires

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.



14
votes

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"]);
});


0 commentaires

0
votes

En regardant http: //www.breezejs. Com / Sites / Tous / APIDOCS / Fichiers / A40_ELTYTYMETADATA.JS.HTML # L1452 ,

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"?


0 commentaires

3
votes

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;
}


0 commentaires

0
votes

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;
            }
        }


0 commentaires

0
votes
        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();

1 commentaires

Bien que ce code puisse répondre à la question, il serait préférable d'inclure certains contexte , expliquant comment Ça fonctionne et quand à l'utiliser. Les réponses du code seulement ne sont pas utiles à long terme.



0
votes

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.

Le résultat final était beaucoup moins d'annotation EF requise. Mon type dossueux est: xxx


0 commentaires