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