在控制器中,我希望能够获得模型的客户端验证规则。我使用数据注释附加了一些属性,并希望能够通过ajax调用将某些内容传递回客户端,以便我可以自动构建jquery validate选项。
通常情况下,这是通过不引人注意的东西免费完成的,但我正在尝试利用敲除绑定,同时仍然不必在服务器和客户端上复制验证规则。
如果不在模型服务器端使用反射,我有点不确定如何实现这一点。
答案 0 :(得分:26)
在我的Mvc Controls Toolkit中,我根据淘汰图书馆开发了助手。这些助手不仅有助于编写淘汰代码,还可以通过Unobtrusive验证和全球化来增强淘汰库。此外,绑定机制得到了增强,包括复杂的控件,如DatetimePicker,以及其他“复杂”(由不同的html部分制作)控件。
最后,可以通过Razor助手定义淘汰模板。
请参阅文档here,here,here和here。我还有一些教程,展示如何与我的助手实现高级功能:
Low BandWidth Transfers with The Client Side Templates of the Mvc Controls Toolkit
答案 1 :(得分:1)
取决于您确切需要做什么,Breeze js可能是最佳解决方案。特别是,如果您使用EF,您可以在客户端复制服务器EF DbContext
的大部分功能,当然包括验证,还可以更改跟踪,{ {1}},一种简单的语法,类似于LINQ查询,缓存,序列化和反序列化以允许脱机工作以及许多其他事情。
使用Breeze js的基本步骤是:
当然,并非客户端上的所有功能都会被复制,但您可以做很多事情:
.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