我使用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>
有人知道为什么我的下拉列表上的验证不起作用吗?
感谢。
答案 0 :(得分:3)
也偶然发现了这一点,经过一些反复试验后我发现了以下内容:
验证失败,因为optionsCaption使用undefined作为值。
您的模型显然使用''(在我的情况下它是null) 因为null!= undefined它不知何故都崩溃了。
了解这一点,有两种解决方案:
答案 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:' - 选择 - '不适用于验证。我的意思是这个元素显示在我的下拉列表中,但验证过程不会将其视为验证错误。
我明确地要在我的列表中添加一个元素。然后,在我的下拉列表中选择此元素时,它将标记为红色。