淘汰赛+ mvc 3 +validation

在控制器中,我希望能够获得模型的客户端validation规则。 我已经使用数据注释附加了一些属性,并希望能够通过ajax调用回传到客户端,所以我可以自动构buildjqueryvalidation选项。

通常这是免费的与不显眼的东西,但我试图利用淘汰赛的绑定,而仍然不必复制服务器和客户端上的validation规则。

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

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

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

请参阅这里 , 这里和这里的文档。 我也有一些教程,展示了如何使用我的助手实现高级function:

使用Mvc控件工具包的客户端模板进行低带宽传输

用客户端模板处理大量数据

用客户端模板处理大量的数据2

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

使用Breeze js的基本步骤是:

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

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

  • 在客户端创build新的实体
  • 在客户端进行查询,将在服务器上执行并返回给客户端
  • 修改客户端上的实体:创build,修改,删除…
  • 在客户端创build关系:例如在父对象中创build新的chlid实体
  • 在客户端调用saveChanges ,这将把所有跟踪到的更改传输到服务器,以便更新后端
  • 当然,当你这样做的时候,你会得到自动的客户端validation,并且当你调用.saveChanges

最后,您可以扩展和修改服务器代码以包含一些业务逻辑,这样您可以做的远不止是将EF模型公开给客户端。

这是一个相当的任务。 您希望能够将您的C#代码转换为具有相应数据types转换等的Javascript。您最好在服务器端和客户端写两个单独的validation集合。 要比自己编写自己的转换框架和维护它更容易

在模型上使用你喜欢的属性validation:

  public class ModelWithValidation { public int Id { get; set; } [Required] public string Name { get; set; } } 

在mvcforms

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

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

 var form = $("form"); form.removeData('validator'); form.removeData('unobtrusiveValidation'); $.validator.unobtrusive.parse(form); $("form").valid() //true false