使用ASP.NET MVC实现字段validation的最佳方式是什么?
我正在build立一个使用ASP.NET的公共网站,作为可交付成果的一部分,我需要做一个pipe理站点的数据录入的东西,显示在公共网站,我想知道什么技术或程序是人们使用ASPvalidation条目.NET MVC。
看一看JQuery Validation插件,这个插件是非常棒的,它很容易实现,并且具有所有你需要的function,包括通过AJAX进行远程validation。
另外一个示例MVC控制器方法可以在这里find,它基本上使用JsonResult操作types,如:
public JsonResult CheckUserName(string username) { return Json(CheckValidUsername(username)); }
@Chuck – 你不能在ASP.NET MVC中使用AjaxToolKit控件。 他们只能在ASP.NET页面回发模型中工作。
更新:
截至2008年8月20日,您可以使用ASP.NET MVC框架内的Ajax控件工具包的脚本文件。 这是一个发布的链接。
此外, 这里是一个使用它们来创buildStephen Waltherpopup日历的教程 。
我只是想确保每个人都有正确的信息,如果他们读这个线程。
IMO使用xVal与jQuery和DataAnnotationsModelBinder是最好的组合。
然而有时候,有些validation规则不能在客户端完全检查,所以你需要使用远程客户端validation。
我想通过xVal / jQuery.validate一般实现远程客户端validation的方式,以便
- validation规则仅保留在您的ASP.NET MVC模型中
- 你只写一次validation规则,而且只能在易于testing的C#代码中使用。 没有JavaScript或其他客户端的对应。
- 没有必要分支或以其他方式修改xVal或jquery.validate
- 所有你需要做的每个新的远程表单validation规则是从本文中显示的基类派生。
我写了一篇关于这个描述所有细节的博客文章 。
我喜欢在ASP.NET MVC应用程序中使用LiveValidation库。 有了它,我能够设置一种方法来在客户端和服务器上进行validation。 这样,用户在提交表单之前就会知道某些事情是错误的,然后在其他情况下使用服务器端function。
我从这篇文章开始,在如何设置类似的设置方面做了很好的工作:
ASP.NET MVC的基于模型的客户端validation
预览版5中有一些新的validationfunction。
我的方式:
我正在按照预览4发行版附带的帐户控制器中显示的示例进行操作,其中字段在控制器中进行检查,如果遇到错误,则会在同一视图中汇总string错误数组,以便在启动请求。
我也一直在关注MVC上的Stephen Walther的想法,我认为这个post很好用,重新填写提交的数据,然后再提交。
你们用什么?
你看过AjaxToolKit提供的控件吗? 我已经使用了MaskedEditExtender和ValidatorCalloutExtender,并且对结果非常满意。
@戴尔 – 感谢纠正我的那一个! 没有意识到(上周刚刚开始使用工具包)。 请忽略我的build议:)
@ Zack :Yeap,我也读过这篇文章,并基于该职位,所以SO使用jQuery作为他们的JavaScript库。 我不能说SO团队,但我的教育猜测是,他们更有可能使用jQuery中的ajax特性来处理他们的ajax请求。 如果你使用jQuery , Prototype和MooTools这样的JavaScript库,实际上并不是那种不好的代码。 然后,您使用新的JsonResult ActionResult返回值为您的操作,并对他们做出一个Ajax请求。 这些库为您封装了XmlHttpRequest对象,使得调用Ajax调用和浏览器更加容易。
如果您想要客户端/服务器端validation,您可以在codeplex上使用.netvalidation框架 。 它根据模型中定义的规则为jQueryvalidation插件生成代码。 此外,如果您使用框架的“高级”function,您可以手动控制jQueryvalidation插件的设置。 检出mvc快速启动 。
使用客户端validation和服务器端validation的混合。
对于客户端validation, Daniel Pollard的答案中描述的方法听起来很合理。 客户端validation不是强制性的,但会为用户提供更好更快的响应体验。
另一方面,服务器端validation应该是强制性的:永远不要信任来自客户端的input。 我会毫不犹豫地研究Preview 5中的ASP.NET MVC框架所提供的function(如Matt Hinze的回答中所述)
我最喜欢的方式是使用基于模型的属性来执行客户端和服务器validation。 我写了一篇关于此的短文,并发布了源代码,基本上可以让你创build一个这样的类
class User { [Required] public string Name{get;set;} [Email][Required] public string Email {get;set;} }
并生成适当的JavaScript代码来执行客户端validation以及服务器端validation运行将validation您提交的表单。
阅读这里的post
戴尔·拉根写道:
你不能在ASP.NET MVC中使用AjaxToolKit控件
AJAX如何处理堆栈溢出? JQuery做到了吗? 在他的Coding Horror发表的JavaScript Ninjas的秘密 Jeff写了关于在编写Stack Overflow时使用JQuery的内容。
当然,他们没有手动编码。 当2005年左右推广“AJAX”这个术语时,我曾经用过所有的XMLHttpRequest JavaScript。那真是一场噩梦。
@ 查克 – 不用担心。 这就是为了什么。 你学到了东西,问这个问题的人学到了一些东西。
AJAX如何处理堆栈溢出? JQuery做到了吗?
- 右键单击该页面
- 在popup菜单中查找“查看页面源”
- 点击它
🙂
如果您想坚持开箱即用的function,但需要扩展它,请在这里查看我的答案,以了解有关IDataError的问题。
基本上我使用数据注释和模型绑定器来实现更复杂的逻辑。 我发现它是一个非常干净的方式,让我留在MS提供的范围内。
我解释了如何使用模型绑定器来添加模型的类级别检查,而不必使用IDataError
,正如你在这里看到的那样,可能会很笨拙。 它仍允许使用[Required]属性或任何其他自定义validation属性,但可以添加或删除单个模型错误。 有关如何使用数据注释的更多信息,我强烈推荐Scott Gu的这篇文章 。
在ASP.NET MVC中实现validation的一种方法是使用Data Annotations和客户端validation。 本文展示了如何为entity framework生成的模型类做到这一点。