0

我有一个带热毛巾的 SPA(Breeze 1.4.5、Durandal 2.0.1、Knockout 3.0.0、Bootstrap 3.0、jquery 2.0.3),我在客户端视图中使用 ko.extenders 进行了验证,并且一切正常,但是当我扩展一个 observable 时(导航属性)与 ko.extenders 验证不起作用,但错误消息未显示在视图中。我有下一节课:

public class Animal
{
    public Animal()
    {
        Actions = new List<Action>();
    }

    public int Id { get; set; }        
    public string Name { get; set; }

    public virtual ICollection<Action> Actions { get; set; }
}

public class Action
{
    public int Id { get; set; }
    public int AnimalId { get; set; }
    [Required]
    public int ActionTypeId { get; set; }
    [Required]
    public string Name { get; set; }
    public string Description { get; set; }
}

风景:

<div data-bind="with: animal">
<input data-bind="value: name"/>
<div data-bind="foreach: actions">
    <div>
        <p data-bind="css: { errorMessageForm: name.hasError }">
            <input type="text" data-bind="value: name, valueUpdate: 'afterkeydown'" maxlength="128" />
            <span data-bind="visible: name.hasError, text: name.validationMessage"></span>
            <span data-bind="visible: name.hasError, text: 'Has Error'"></span>
            <span data-bind="visible: !name.hasError(), text: 'No Has Error'"></span>
        </p>
    </div>
    <div>
        <p data-bind="css: { errorMessageForm: description.hasError }">
            <input type="text" data-bind="value: description, valueUpdate: 'afterkeydown'" maxlength="128" />
            <span data-bind="visible: description.hasError, text: description.validationMessage"></span>
        </p>
    </div>
    <div>
        <p data-bind="css: { errorMessageForm: actionTypeId.hasError }">
            <select data-bind="options: $root.actionTypes, optionsText: 'name', optionsValue: 'id', value: actionTypeId, valueUpdate: 'change'"></select>
            <span data-bind="visible: actionTypeId.hasError, text: actionTypeId.validationMessage"></span>
        </p>
    </div>
</div>

<button data-bind="click: $root.addAction"><span>Add Action</span></button>

的代码addAction

addAction = function () {
            var action = datacontext.createAction();
            //add validators
            action.actionTypeId.extend({ intRequired: 'The action type is required' });
            action.name.extend({ required: 'The name is required' });
        }

的代码createAction

function createAction() {
        var initialValues = {
            animalId: getCurrentAnimalId()
        };
        var action = manager.createEntity(entityNames.action, initialValues);

        return action;
    }

要验证的扩展器在页面中是相等的Using extenders to augment observables

validationMessage财产actionTypeIdname没有显示。

我设置了断点来验证validationMessageandhasError的值viewmodel,它具有正确的值,但在视图中没有显示validationMessages

在 html 视图中添加此行以验证验证状态后:

<span data-bind="visible: name.hasError, text: 'Has Error'"></span>
<span data-bind="visible: !name.hasError(), text: 'No has Error'"></span>

我测试了 de SPA,稍后使用按钮添加新操作,addAction视图显示两次重复的输入 html 控件,然后我在一个输入中输入一个值,name验证消息出现但仅在一个输入 html 控件中,在第二个输入 html 控件中(重复)验证消息没有出现。

下一行导致“输入html控件”的两次重复:

<span data-bind="visible: !name.hasError(), text: 'No has Error'"></span>

该视图不会在来自微风实体的导航属性项中使用 ko.extenders 刷新验证消息。

我已经再次测试了所有内容,但我没有使用 Breeze 创建实体,只是我使用了简单的对象并且所有工作都完美......但我真的需要使用 Breeze 来创建实体。

4

0 回答 0