2012-02-16 66 views
17

我一直在使用KnockoutJS,KnockoutJS Mapping插件和jQuery 1.7.1构建使用ASP.NET MVC 2的页面。我希望能够使用KnockoutJS验证插件(找到here)。不过,我需要同时进行服务器端和客户端验证。将视图模型映射到KnockoutJS验证

是否有可能让我的视图模型映射到使用.extend()方法的KnockoutJS Validation plugin

编辑:例子。自动关闭此:

[Required] 
public string Firstname { get; set; } 

进入这个:

var viewmodel = { 
    firstname: ko.observable().extend({ required: true }); 
} 
+0

您是否在您的C#模型上使用数据注释并使用EditorFor填充客户端验证规则,或者您想要?您可以使用与MVC内置的相同的不显眼的客户端验证,您可以使用标准MVC样式表单而不需要太多工作(至少在具有Internet应用程序模板的MVC3中)。 – kendaleiv 2012-02-17 22:27:35

+0

请参阅我原来的编辑 – Ryan 2012-02-18 03:27:54

+0

这是一个非常有趣的方法,我给了它很多思考。我一直在考虑将行为代码从C#生成到Javascript。也就是说,我认为你必须创建一些反映模型并生成javascript的东西。也许只是验证部分,让映射插件完成它的工作。映射和生成的验证代码的组合可以为您提供所需的内容。我认为你需要生成验证代码的原因是因为我认为你很难仅使用Javascript生成验证代码,但我可能是错的。 – 2012-02-20 10:22:56

回答

7

Mvc Controls Toolkit我实现了一个引擎,可以在knockout.js.上启用通常的Mvc验证(数据注释或其他)。可以启用客户端和服务器端验证。此外,淘汰赛可以与Mvc助手一起使用,一些绑定自动推断等。

+0

如果你可以通过使用MVC控件工具包来实现它,那就太好了。非常感谢 – Ian 2016-02-02 10:51:53

0

验证插件,在您扩展您要验证的观测工作的方式。

无论它们是从映射创建的,只是创建一个函数,在映射完成后运行并添加所需的所有验证。

或者,如果你想要的话,你可以使用验证绑定。阅读Github上的自述文件进行基因敲除验证,并了解他们是如何做到的。

+0

请参阅原始问题中的编辑 – Ryan 2012-02-18 03:27:42

1

我建议使用内置的MVC客户端验证,则可能需要调用它,试试这个:

$.validator.unobtrusive.parse(yourFormElement) 

代码来自:https://stackoverflow.com/a/5669575/941536

不知道是否有MVC2不显眼的客户端验证,虽然,如果需要的话,不确定是否可以升级到MVC3。

+4

这不是验证KnockoutJs的首选方法。你不想验证表单元素。你想验证视图模型。 – 2012-02-20 10:14:20

+2

有没有简单的方法重用DataAnnotations或FluentValidator .Net代码与Knockout验证,并让它验证Knockout视图模型?我宁愿避免创建和维护两组验证规则,但如果Knockout视图模型和.Net模型不匹配或者过于不相似,则这可能更加困难。 – kendaleiv 2012-02-25 06:32:24

+0

“这不是验证KnockoutJs的首选方法”。为什么?验证与用户输入连接,输入元素通常映射到模型属性。显示未连接到输入字段的错误消息,但显示用户不可见的某些模型属性可能会使用户很困惑。 – 2012-02-29 21:43:21

5

如果您使用的是knockoutjs和jquery,我想出了以下用于基本客户端验证的非常简单的方法。

无论你想在页面上显示错误消息,包括span标签是这样的:

<span name="validationError" style="color:Red" 
data-bind="visible: yourValidationFunction(FieldNameToValidate())"> 
* Required. 
</span> 

显然,你需要写“yourValidationFunction”做任何你想做的事情。它只需返回true或false,true表示显示错误。

如果显示任何验证错误,您可以使用jquery防止用户继续。你可能已经有一个保存按钮触发一个javascript函数做一些AJAX或什么的,所以只包括本在它的顶部:

if ($("[name='validationError']:visible").length > 0) { 
     alert('Please correct all errors before continuing.'); 
     return; 
    } 

这是很多比许多其他验证解决方案了更简单,更灵活那里。您可以将错误消息定位到任何地方,而无需学习如何使用某个验证库,并且此方法可以与服务器端技术无关。

+0

+1我喜欢你的解决方案的简单性。我目前正在为非必填字段和淘汰赛争取jQuery valdiate,而你的回答指向了一个新的方向。 – 2013-02-08 16:17:26