【问题标题】:Breeze Server Side validation with resources translation带有资源翻译的微风服务器端验证
【发布时间】:2014-07-10 21:19:01
【问题描述】:

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

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

第一个注释 Display 将更改我的输入名称,我将在 Angular 中处理那个,因此我们可以跳过那个,但我想要第二个注释 Required(ErrorMessageResourceType = ...)],我宁愿让 Breeze 自行处理... 有更多解释,在我的资源文件中,我将我的翻译 Required 翻译成英文,就像 The {0} field is required. 和我在 Breeze 中看到的实际错误消息是 '%displayName%' is required. 等等马上我可以看到它没有从模型中提取任何东西,也没有从资源文件中提取任何东西,而是一个内置的 Breeze 错误消息。我从这个Breeze Server-side validation page 中找到了一些信息,它确实谈到了自定义验证器,但我认为这实际上应该是内置的,不是吗?有没有办法让它们自动填充?哦,为了提供一些关于我自己的项目的信息,我在 ASP MVC5 中将 Breeze 与 WebApi 控制器一起使用,并将 EF6 与 Breeze.ContextProvider.EF6 一起使用。 Breeze 是从 Models 中获取所有可能的 Models 数据注释,还是实现了有限的集合?从这个微风页面Add a Breeze validator,我看到了其中的几个,但我不确定它是否只是客户端。

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

如果您提供答案,能否附上代码示例,我总是更直观...谢谢 :)

【问题讨论】:

    标签: breeze


    【解决方案1】:

    所以我没有任何答案,我会用我目前发现的内容进行回复...虽然我已经提交了 suggestion in Breeze user voice here

    要进行翻译,我必须在我的 EMFactory 中启动微风时首先翻译 Breeze Validators,我发现的方式是这样的:

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

    最后在我的 DataService 中,我用这个调用了我的 TranslationService

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

    ...所以这项工作,我只需随时用我的新翻译更新我的 TranslationService。如果其他人有更好/更清洁的解决方案,我会很高兴看到它......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2016-09-13
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多