保存时验证错误

时间:2012-12-21 13:14:12

标签: breeze

使用Breeze使用SaveChanges()进行保存时,如果我有必填字段,则在进行简单更新时会出错。

E.g。

我有一个用户表,其中NameEmail字段不需要Email字段。

我可以显示用户名列表(但不想显示电子邮件)。

显示有效,但保存永远不会被调用 - 我在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>

并且viewmodel保存部分位于:

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

1 个答案:

答案 0 :(得分:1)

嗯...你说电子邮件不是必需的,但元数据认为它是。您能通过查看此属性的元数据来确认吗?代码看起来像这样。

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

如果元数据认为该字段是必需的,则可能在服务器上将其设置为此字段。因此,请查看您的EF模型,并检查[Required]属性是否尚未添加到此属性中。另外,检查此字段是否为不可存在的数据库。

另外一项需要注意的事项,默认情况下,breeze将尝试在任何保存之前验证服务器上的 整个 实体,甚至是那些未触及的字段,即使只有修改过的字段实际上会更新。这是设计的。

但是,您可以通过设置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 });