2012-12-21 86 views
2

使用Breeze使用SaveChanges進行保存時,如果我有必填字段,則在進行簡單更新時會出錯。微風:驗證保存時出錯

我的用戶提供了名稱的表格和電子郵件字段在不需要的電子郵件領域。

我可以顯示用戶名列表(但不希望顯示的電子郵件)

顯示的作品,但保存不會被調用 - 我在Javascript中得到了驗證錯誤

系統無法保存要驗證錯誤:「電子郵件」是必需的

但可以肯定這應該是隻產生在球場上簡單的更新我已經改變,不應該做的電子郵件什麼?

奇怪的是,如果我只是改變了第一個項目在列表中

任何想法

的HTML看起來像這樣

<a href="#" data-bind="click: save">Save</a> 
<ul data-bind="foreach: modules"> 
<li > 
    <form> 
     <input type="checkbox" data-bind="checked: IsRunning" /> 
     <input type="text" data-bind="value: ModuleName, css: { done: IsRunning }" /> 
    </form> 
    </li> 
</ul> 

和視圖模型保存的部分是我沒有得到一個錯誤低於

function saveChanges() { 
    if (manager.hasChanges()) { 
     manager.saveChanges() 
      .then(saveSucceeded) 
      .fail(saveFailed); 
    } else { 
     logger.info("Nothing to save"); 
    }; 
} 
function saveSucceeded(saveResult) { 
    logger.success("# of Modules saved = " + saveResult.entities.length); 
    logger.log(saveResult); 
} 

function saveFailed(error) { 
    var reason = error.message; 
    var detail = error.detail; 

    if (reason === "Validation error") { 
     handleSaveValidationError(error); 
     return; 
    } 
    if (detail && detail.ExceptionType.indexOf('OptimisticConcurrencyException') !== -1) { 
     // Concurrency error 
     reason = 
      "Another user, perhaps the server, may have deleted one or all of the todos."; 
     manager.rejectChanges(); // DEMO ONLY: discard all pending changes 
    } 

    logger.error(error, 
     "Failed to save changes. " + reason + 
     " You may have to restart the app."); 
}; 
function handleSaveValidationError(error) { 
    var message = "Not saved due to validation error"; 
    try { // fish out the first error 
     var firstErr = error.entitiesWithErrors[0].entityAspect.getValidationErrors()[0]; 
     message += ": " + firstErr.errorMessage; 
    } catch (e) { /* eat it for now */ } 
    logger.error(message); 
} 

Mike

回答

1

hm ...你說電子郵件不是必需的,但元數據認爲它是。你能通過查看這個屬性的元數據來確認嗎?代碼看起來像這樣。

var userType = myEntityManager.metadataStore.getEntityType("User"); 
var emailProp = userType.getProperty("email"); 
var isRequired = !emailProp.isNullable; 

如果元數據認爲該字段是必需的,那麼它可能是在服務器上設置的。所以看看你的EF模型,並檢查[Required]屬性沒有被添加到這個屬性。另外,檢查這個字段是否是不可空的是數據庫。

另外一個項目需要注意,默認情況下,微風將嘗試驗證服務器上的整個實體之前,任何保存均未觸及,即使只修改字段將實際獲得,甚至這些領域更新。這是設計。

但是,您可以通過設置EntityManager的「validationOptions」像這樣抑制這種行爲:

var vo = new breeze.ValidationOptions({ 
    validateOnSave: false, 
    validateOnQuery: false, // not needed here but shown for completeness 
    validateOnAttach: true // not needed here but shown for completeness 
}); 
myEntityManager.setProperties({ validationOptions: vo }); 
+0

感謝您的答覆。對不起 - 我的問題不清楚。電子郵件是數據庫所必需的,但未在應用程序中顯示或使用。我現在明白,驗證正在成爲現實,因此我通過關閉驗證來解決(現在)。但奇怪的是,電子郵件字段確實有價值 - 但它不會顯示給用戶,所以應該導致驗證錯誤 - 應該嗎? – Mike

+0

微風實際上並不知道你在UI中渲染什麼,它只知道模型。如果該屬性在元數據中並且是必需的,那麼默認情況下它將被驗證。這個想法是因爲它在db上並不意味着它是有效的。但是,如果您不需要該屬性,則可以將其從模型中排除。這有意義嗎? –

+0

重讀您的評論,你是否認爲驗證實際上是不正確的,即使它包含數據,它報告了一個必需的驗證錯誤,還是驗證報告了一些其他錯誤? –