淘汰+ mvc 3 +验证

时间:2011-04-21 08:43:14

标签: asp.net-mvc asp.net-mvc-3 jquery-validate knockout.js

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

通常情况下,这是通过不引人注意的东西免费完成的,但我正在尝试利用敲除绑定,同时仍然不必在服务器和客户端上复制验证规则。

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

4 个答案:

答案 0 :(得分:26)

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

最后,可以通过Razor助手定义淘汰模板。

请参阅文档herehereherehere。我还有一些教程,展示如何与我的助手实现高级功能:

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

答案 1 :(得分:1)

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

使用Breeze js的基本步骤是:

  • 在服务器中创建EF模型
  • 在服务器上添加NuGet包以创建将模型公开给客户端的Web API服务。这是通过使用数量极少的C#代码完成的。这样做的一个方面是公开元数据:对象,关系和额外信息的定义,如数据注释验证信息
  • 为客户端添加一个js Nuget Package,用于在客户端复制EF行为。

当然,并非客户端上的所有功能都会被复制,但您可以做很多事情:

  • 在客户端创建新实体
  • 在客户端进行查询,该查询将在服务器上执行并返回给客户端
  • 修改客户端上的实体:创建,修改,删除...
  • 在客户端创建关系:例如,在父对象中创建新的chlid实体
  • 在客户端调用.saveChanges,这会将所有跟踪的更改传输到服务器,以便后端更新
  • 当然,当您这样做时,您将获得自动客户端验证,并在您致电saveChanges
  • 时进行额外的服务器验证

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

答案 2 :(得分:0)

这是一项非常艰巨的任务。您希望能够将C#代码转换为具有相应数据类型转换等的Javascript。您最好在服务器端和客户端写下两组独立的验证。维护它比自己编写自己的转换框架并维护它更容易

答案 3 :(得分: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