2011-04-21 101 views
44

在控制器中,我希望能够获得模型的客户端验证规则。我使用数据注释附加了一些属性,并希望能够通过ajax调用将某些内容传递回客户端,以便我可以自动构建jquery验证选项。Knockout + mvc 3 +验证

正常情况下,这是免费的与不显眼的东西,但我试图利用淘汰赛的绑定,而不必复制服务器和客户端上的验证规则。

没有在模型服务器端使用反射,我有点不确定如何实现这一点。

+0

您是否找到了可接受的解决方案?如果是这样,请在这里回答你自己的问题。 – 2011-09-29 21:26:25

+0

目前还没有,转移到另一个项目,但将返回。 – RubbleFord 2011-09-30 07:56:03

+0

请参阅:http://stackoverflow.com/questions/9878639/upshot-mvc-4-handling-of-date-knockout-bindings/9890429#9890429 – 2012-04-16 11:28:51

回答

0

这是一项相当艰巨的任务。你希望能够通过相应的数据类型转换等将C#代码转换为Javascript。你最好在服务器端和客户端写两个单独的验证集合。与自己编写自己的转换框架并维护自己的转换框架相比,维护它要容易得多

+0

我不认为这很容易:-s – RubbleFord 2011-04-22 05:32:36

+0

可能有一小组标准验证可以即时生成JS的类型(例如required,regex等);只有自定义的验证器,你必须在客户端和服务器上实现。 – namuol 2011-05-13 13:09:42

26

在我的Mvc Controls Toolkit中,我开发了基于knockout库的Helpers。这些助手不仅可以帮助编写淘汰赛代码,还可以通过Unobtrusive验证和全球化来增强淘汰赛库。此外,绑定机制得到了增强,以包含诸如DatetimePicker等复杂控件以及其他“复杂”(由不同html部件制作)控件。

最后,敲除模板可以通过Razor助手定义。

请参阅文档here,here,herehere。我也有一些教程,说明如何实现我的助手高级功能:

Low BandWidth Transfers with The Client Side Templates of the Mvc Controls Toolkit

Handling Big Amounts of Data with Client-Side Templates

Handling Big Amounts of Data with Client-Side Templates 2

+0

这很好,但我使用FluentValidation进行验证,它更新了ModelState对象。当呈现视图时,由FluentValidation框架生成的来自ModelState的错误将适当地应用于每个输入。 MVC控件工具包是否查看模型状态来确定哪些输入需要突出显示? – Dmitry 2012-10-11 20:05:17

+0

服务器端错误取自模型状态,因此它们可以与使用模型状态的任何技术一起使用......并且如果您将错误手动添加到模型状态。 – 2012-10-12 15:07:38

+0

我会讨厌三重验证。验证域模型,验证视图模型,现在是另一个库......它的重复类型。应** **验证,而不是3. – 2013-03-08 19:44:30

0

在模型中使用的属性验证,你喜欢:

public class ModelWithValidation 
{ 
    public int Id { get; set; } 

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

以mvc形式

@using(Html.BeginForm()) 
{  
    @Html.TextBoxFor(m => m.Name, new {data_bind = "value: name"}) 
    @Html.ValidationMessageFor(m => m.Name) 
} 

在jQuery测试中,如果表单是有效的onSubmit或在knockout保存函数中调用下一个代码来验证输入。您必须包含jQuery.unobtrusive *和jQuery.validate *库。不要忘记在服务器端验证输入!

var form = $("form"); 
form.removeData('validator'); 
form.removeData('unobtrusiveValidation'); 
$.validator.unobtrusive.parse(form); 

$("form").valid() //true false 
1

根据您确切需要做的事情,Breeze js可能是最佳解决方案。特别是,如果您使用EF,则可以在客户端复制服务器EF DbContext的大部分功能,当然还包括验证,还包括更改跟踪.saveChanges,这是一种类似于LINQ查询的简单语法,缓存,序列化和反序列化以允许离线工作以及其他许多事情。

的基本步骤与微风JS工作是:

  • 在服务器
  • 创建一个EF模型在服务器上添加一个NuGet包来创建模型暴露在客户端的Web API服务。这是在C#代码数量惊人的情况下完成的。其中一件事就是公开元数据:对象,关系和额外信息的定义,如数据注释验证信息
  • 为客户端添加一个js Nuget包,这将用于复制EF上的EF行为客户端。

当然,并不是所有的服务器上的功能将在客户端上复制的,但你可以做很多事情:

  • 在客户端
  • 化妆创造新的实体查询客户端,这将在服务器上执行并返回给客户端
  • 修改客户端上的实体:创建,修改,删除...
  • 在客户端创建关系:例如创建新的chlid实体在父对象在客户端
  • 呼叫saveChanges,这将使得后台更新,当然
  • 所有跟踪的更改传输到服务器,而你这样做,你会得到自动的客户端验证,并同时,只要你拨打.saveChanges

最后额外的服务器验证,可以扩展和修改服务器代码,包括一些业务逻辑,这样就可以做比单纯的EF模型暴露给客户更多。