我的下拉列表中的Knockout验证不起作用

时间:2013-03-31 08:51:44

标签: validation knockout.js breeze

我使用durandal模板+ breeze工作在asp.net mvc项目上。

我想在我的视图中定义验证逻辑以添加/编辑操作。

到目前为止,它适用于文本,从数据库填充的下拉列表:当元素不包含任何数据时,由于敲除验证,元素被标记为红色。

但它不适用于从简单列表中填充的下拉列表。

填充列表的元素来自枚举:

public class Transport
{
    [Key]
    int id { get; set; }
    ...
    [Required]
    public EnumCategory Category { get; set; }
}

public enum EnumCategory
{
    Cat1,
    Cat2,
    Cat3
}

第一个问题:我不知道是否有可能从我的模型(服务器端)检索枚举以使用客户端?现在,我创建了一个数组客户端来填充我的下拉列表:

var categories = [
    { id: 1, description: "Cat1" },
    { id: 2, description: "Cat2" },
    { id: 3, description: "Cat3" }];

第二个问题:在显示我的视图时,如果类别下拉列表已包含某些数据,则验证有效(我的意思是如果用户清除下拉列表,则该字段标记为红色)。但是,如果类别下拉列表在显示视图时没有包含任何数据,则下拉列表不会标记为红色。

验证失败时我所做的是如果无效则更改元素的背景颜色(感谢css'input-validation-error'>>红色)。

<select data-bind="options: $root.categories,
                   optionsText: 'description',
                   optionsValue: 'id',
                   optionsCaption: 'Choose...',
                   value: category,
                   validationOptions: { errorElementClass: 'input-validation-error' },
                   valueUpdate: 'afterkeydown'">
</select>

有人知道为什么我的下拉列表上的验证不起作用吗?

感谢。

3 个答案:

答案 0 :(得分:3)

也偶然发现了这一点,经过一些反复试验后我发现了以下内容:

验证失败,因为optionsCaption使用undefined作为值。

您的模型显然使用''(在我的情况下它是null) 因为null!= undefined它不知何故都崩溃了。

了解这一点,有两种解决方案:

    Model上的
  1. 将值设置为undefined(在您的示例中为transport.category(undefined))并使用像您习惯的optionsCaption
  2. 自己添加一个自定义的空selectItem并跳过optionsCaption(您使用的解决方案)

答案 1 :(得分:0)

当您说“清除下拉列表”时,如果只有三个选项,如何选择一个选项。你可以制作第一个下拉项目“选择一个项目......”,这样你就知道总会有一个项目。如果下拉列表索引为0,则显示红色错误消息。

如果selectedindex为0或itemcount为0,则另一个选项是显示红色错误消息。

这有帮助吗?

答案 2 :(得分:0)

最后,我通过在我的类别列表中添加一个空id的元素来实现它:

var categories = [
    { id: '', description: '--Choose--' },
    { id: 1, description: 'Non classé' },
    { id: 2, description: 'Non nucléaire' },
    { id: 3, description: 'Classe II irradié' },
    { id: 4, description: 'Classe III' }];

我不知道为什么,只是简单地添加optionsCaption:' - 选择 - '不适用于验证。我的意思是这个元素显示在我的下拉列表中,但验证过程不会将其视为验证错误。

我明确地要在我的列表中添加一个元素。然后,在我的下拉列表中选择此元素时,它将标记为红色。