2014-07-02 94 views
1

我期待到使用模型驗證與微風,我看到它添加例如[Required]時,但該錯誤消息似乎來自微風本身來沒有工作,我期待它拉該消息直接來自Model,但事實並非如此。我必須用資源翻譯(英語,法語,西班牙語)來構建我的下一個項目,我寧願讓Breeze控制器以某種方式直接獲取錯誤消息。舉個例子,我在以前的項目中,我曾與這個模型:微風服務器端驗證

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

其中第一註釋Display會改變我輸入的名字,我會處理的一個角中的,所以我們可以跳過一個,但我想有第二批註Required(ErrorMessageResourceType = ...)],我寧願有微風把它本身......具有更多的解釋,在我的資源文件,我在做我的英文翻譯Required翻譯,因爲這The {0} field is required.和實際的錯誤信息我裏面微風看到的是'%displayName%' is required.所以我馬上可以看到它是不是從型號沒有資源文件拉動什麼,是相當內置的微風錯誤消息。我從這個Breeze Server-side validation page發現了一些信息,它確實談論了自定義驗證器,但我認爲這實際上應該是內置的,不是嗎?有沒有辦法讓他們自動填充?哦,並提供一些關於我自己的項目的信息,我在ASP MVC5中使用Breeze與WebApi控制器,並使用EF6與Breeze.ContextProvider.EF6。 Breeze是否可以從模型中獲取可能的所有模型數據註釋,或者它是否實現了有限集?從這個微風頁面Add a Breeze validator,我看到其中幾個,但我不知道它只是客戶端。

我也發現了這個問題/答案Translate breeze validation messages,但似乎是客戶端,再次我寧願有微風從我的模型提供的資源自動獲得我的翻譯。

如果你提供一個答案,你可以請包括代碼示例,我總是更直觀......謝謝:)

回答

1

所以我沒有任何答案,我會回覆我迄今發現的。 ..雖然我提交了suggestion in Breeze user voice here


Breeze支持資源翻譯的答案目前尚不支持要做翻譯,我必須首先翻譯Breeze Validators當我在EMFactory中開始微風時,我發現的方式是這樣的:

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來處理d isplayNames我的微風背景下的實體:

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不管什麼時候我要。如果其他人有更好的/更清潔的解決方案,我會很樂意看到它...