Breeze服务器端验证与资源转换

Breeze服务器端验证与资源转换,breeze,Breeze,我正在研究如何在Breeze中使用模型验证,我发现它在添加例如[Required]时确实有效,但错误消息似乎来自Breeze本身,我希望它直接从模型中提取消息,但事实并非如此。我必须使用翻译资源(英语、法语、西班牙语)来构建我的下一个项目,我更希望使用Breeze控制器以某种方式直接获取错误消息。例如,在我的上一个项目中,我有一个模型: [Display(ResourceType = typeof(Resources.Validations), Name = "SiteName")] [Requ

我正在研究如何在Breeze中使用模型验证,我发现它在添加例如
[Required]
时确实有效,但错误消息似乎来自Breeze本身,我希望它直接从模型中提取消息,但事实并非如此。我必须使用翻译资源(英语、法语、西班牙语)来构建我的下一个项目,我更希望使用Breeze控制器以某种方式直接获取错误消息。例如,在我的上一个项目中,我有一个模型:

[Display(ResourceType = typeof(Resources.Validations), Name = "SiteName")]
[Required(ErrorMessageResourceType = typeof(Resources.Validations), ErrorMessageResourceName = "Required")]
public string siteName { get; set; }

第一个注释
显示将改变我输入的名称,我将以角度处理该注释,这样我们可以跳过该注释,但我希望第二个注释
是必需的(ErrorMessageResourceType=…)]
,我宁愿Breeze自己处理它。。。经过更多的解释,在我的资源文件中,我用英语翻译了
必需的
翻译,因为{0}字段是必需的。
我在Breeze中看到的实际错误消息是
'%displayName%'是必需的。
因此我可以立即看到它没有从模型中提取任何内容,也没有从资源文件中提取任何内容,而是一条内置的Breeze错误消息。我从中找到了一些信息,它确实谈到了自定义验证器,但我认为它实际上应该是内置的,不是吗?有没有办法让它们自动填充?哦,为了提供一些关于我自己的项目的信息,我在ASP MVC5中使用了带有WebApi控制器的Breeze,还使用了带有
Breeze.ContextProvider.EF6
的EF6。Breeze是从模型中获取所有可能的模型数据注释,还是实现了有限的一组?从这个breeze页面中,我看到了一些,但我不确定这是否只是客户端

我也发现了这个问题/答案,但这似乎是客户端的问题/答案,我还是希望Breeze能够从我的模型中提供的资源中自动获取我的翻译

如果您提供一个答案,请您提供代码示例,我总是更直观。。。谢谢:)

所以我没有任何答案,我会用我目前发现的答案回答。。。Breeze支持资源翻译的答案目前还不受支持,尽管我已经提交了一份

要进行翻译,我必须在我的电子工厂启动Breeze时首先翻译Breeze验证器,我发现的方法是:

function emFactory($cookies, breeze, fileService) {
    var lang = $cookies.lang || "en";

    // load the validator templates translation mapping (external files: validators.{lang}.json)
    var translations = loadValidatorsTranslation();
    breeze.Validator.messageTemplates = translations[lang];

    // Identify the endpoint for the remote data service
    var serviceRoot = window.location.protocol + '//' + window.location.host + '/';
    var serviceName = serviceRoot + 'breeze/BreezeApi';

    var factory = {
        newManager: function () { return new breeze.EntityManager(serviceName); },
        serviceName: serviceName,
        language: lang
    };

    return factory;
}

function loadValidatorsTranslation() {
    return {
        en: {
            // ...
            required: "'%displayName%' is required",
            string: "'%displayName%' must be a string",
            stringLength: "'%displayName%' must be a string with between %minLength% and %maxLength% characters",
            url: "The %displayName% '%value%' is not a valid url"
        },
        fr: {
            // ...
            required: "'%displayName%' est requis",
            string: "'%displayName%' doit être une chaîne de caractère",
            stringLength: "'%displayName%' doit être une chaîne de caractère entre %minLength% et %maxLength% caractères",
            url: "%displayName% '%value%' n'est pas un URL valide"
        }
    };
}
然后,我创建了一个
TranslationService
来处理我的Breeze上下文的displayNames实体:

appDemo.factory('translationService', ['$q', '$timeout', translationService]);

function translationService($q, $timeout) {
    // declare the displayNames translations of entities
    var displayMapping = {
        fr: {
            City: {
                Name: "Nom de Ville"
            },
            Speaker: {
                Bio: "Bio",
                Image: "Image",
                Name: "Nom du Conférencier"
            }
        },
        en: {
            City: {
                Name: "City Name"
            },
            Speaker: {
                Bio: "Bio",
                Image: "Image",
                Name: "Speaker Name"
            }
        }
    };

    // reveal the public functions & return the service 
    return {
        loadTranslationDisplayNames: loadTranslationDisplayNames
    };


    // -- public functions 
    // --------------------
    function loadTranslationDisplayNames(manager, lang, entityTypes) {        
        for (var i = 0, ln = entityTypes.length; i < ln; i++) {
            // get the specific context Entity
            var custType = manager.metadataStore.getEntityType(entityTypes[i]);
            var entityProperties = displayMapping[lang][entityTypes[i]];
            // loop through all properties of this Entity and update their DisplayName
            for (var name in entityProperties) {
                custType.getProperty(name).displayName = entityProperties[name];
            }
        }
    }
}
。。。因此,这项工作和我只是更新我的翻译服务与我的新翻译时,我想。如果其他人有更好/更清洁的解决方案,我很高兴看到它

function dataService($rootScope, $q, breeze, entityManagerFactory, translationService) {
    var service = this;

    // reveal the public functions we want, any other functions will remain private
    service.getSpeakers = getSpeakers;

    var manager = entityManagerFactory.newManager();
    var lang = entityManagerFactory.language;

    return service;

    // -- public/private functions declaration
    function getSpeakers() {
        var query = new breeze.EntityQuery.from("Speakers");

        // load the translation of Breeze DisplayNames entities
        translationService.loadTranslationDisplayNames(manager, lang, ["City", "Speaker"]);

        startProcessingData();

        var promise =
            manager.executeQuery(query)
                   .catch(queryFailed)
                   .finally(processingDataComplete);

        return promise;
    }
}