2

我使用 durandal 模板 + 微风处理一个 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' >> red color)。

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

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

谢谢。

4

3 回答 3

4

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

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

您的模型显然使用了 '' (在我的情况下它是 null),因为 null != undefined 它以某种方式全部崩溃了。

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

  1. 在模型上将值设置为未定义(在您的示例 transport.category(undefined) 中)并像您习惯的那样使用 optionsCaption
  2. 自己添加一个自定义的空 selectItem 并跳过 optionsCaption (您使用的解决方案)
于 2013-06-17T11:09:00.147 回答
0

当您说“清除下拉菜单”时,当只有三个选项时,如何不选择一个选项。您能否将第一个下拉项目设为“选择一个项目...”,以便您知道总会有一个项目。如果下拉索引为 0,则显示您的红色错误消息。

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

这有帮助吗?

于 2013-03-31T15:54:27.520 回答
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: '--Choose--' 对验证不起作用。我的意思是这个元素显示在我的下拉列表中,但验证过程不会将其视为验证错误。

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

于 2013-03-31T16:38:46.527 回答