如何使用从属性属性中提取的元数据添加extend breeze实体类型

0 attributes entity-framework breeze

我想在breeze dataService(客户端)中获取下面提到的自定义属性.

namespace Tam.Framework.Web.Models
{
    [ViewAttribute("app/views/Employee.html")]//this custom class attribute
    public class Employee : BaseEntity
    {
        protected override string OnGetDescriptor()
        {
            return "some description";
        }

        public string FirstName { get; set; }

        [Display(Name = "LAST NAME")]//this custom property attribute
        public string LastName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*yow 5

在服务器上,向Metadata控制器操作添加逻辑,以使用display属性属性补充标准元数据:

[HttpGet]
public virtual string Metadata()
{
    // Extend metadata with extra attributes
    var metadata = JObject.Parse(this.ContextProvider.Metadata());
    var ns = metadata["schema"]["namespace"].ToString();
    foreach (var breezeEntityType in metadata["schema"]["entityType"])
    {
        var typeName = ns + "." + breezeEntityType["name"].ToString();
        var entityType = BuildManager.GetType(typeName, true);

        foreach (var propertyInfo in entityType.GetProperties())
        {
            var attributes = propertyInfo.GetAllAttributes();
            var breezePropertyInfo = breezeEntityType["property"].SingleOrDefault(p => p["name"].ToString() == propertyInfo.Name);
            if (breezePropertyInfo == null)
                continue;

            // handle display attribute...
            var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
            if (displayAttribute != null)
            {
                var displayName = displayAttribute.GetName();
                if (displayName != null)
                    breezePropertyInfo["displayName"] = displayName;
                var displayOrder = displayAttribute.GetOrder();
                if (displayOrder != null)
                    breezePropertyInfo["displayOrder"] = displayOrder;
                var autogenerateField = displayAttribute.GetAutoGenerateField();
                if (autogenerateField != null)
                    breezePropertyInfo["autoGenerateField"] = autogenerateField;
            }

            // allowEmptyStrings.
            if (propertyInfo.PropertyType == typeof(string))
            {
                breezePropertyInfo["allowEmptyStrings"] = true;
                var requiredAttribute = attributes.OfType<RequiredAttribute>().FirstOrDefault();
                if (requiredAttribute != null && !requiredAttribute.AllowEmptyStrings)
                    breezePropertyInfo["allowEmptyStrings"] = false;
            }

            // todo: handle other types of attributes...
        }
    }

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

在客户端上,获取元数据并使用自定义元数据补充breeze实体类型.

function initializeMetadataStore(metadataStore, metadata) {
    var metadataType, metadataProperty, entityProperty, i, j;
    for (i = 0; i < metadata.schema.entityType.length; i++) {
        metadataType = metadata.schema.entityType[i];
        var entityType = metadataStore.getEntityType(metadataType.name);
        for (j = 0; j < metadataType.property.length; j++) {
            metadataProperty = metadataType.property[j];
            entityProperty = entityType.getProperty(metadataProperty.name);
            if (entityProperty) {
                if (typeof metadataProperty.displayName !== 'undefined') {
                    entityProperty.displayName = metadataProperty.displayName;
                }
                if (typeof metadataProperty.displayOrder !== 'undefined') {
                    entityProperty.displayOrder = metadataProperty.displayOrder;
                }
                if (typeof metadataProperty.autoGenerateField !== 'undefined') {
                    entityProperty.autoGenerateField = metadataProperty.autoGenerateField;
                }
                if (typeof metadataProperty.allowEmptyStrings !== 'undefined') {
                    entityProperty.allowEmptyStrings = metadataProperty.allowEmptyStrings;
                }
            }
        }
    }
}

var entityManager = ....something...;
entityManager.fetchMetadata(function (metadata) {
    return initializeMetadataStore(entityManager.metadataStore, metadata);
});
Run Code Online (Sandbox Code Playgroud)

现在,在breeze实体类型中可以使用其他元数据...

var propertyDisplayName = myEntity.entityType.getProperty('lastName').displayName;
Run Code Online (Sandbox Code Playgroud)