在ASP.NET MVC框架中验证发布的表单数据
我一直在使用ASP.NET MVC框架,而真正令我困惑的一件事是我打算如何对发布的表单数据进行服务器端验证。我想我不会回发到相同的URL,但是,如果不这样做,如何重新显示带有输入的数据和错误消息的表单?另外,验证逻辑应该放在哪里?在模型还是控制器中?这似乎是Web表单更强大的几个领域之一(我错过了验证控件)。
解决方案
回答
你看过这个吗?
http://www.codeplex.com/MvcValidatorToolkit
从页面引用
The Validator Toolkit provides a set of validators for the new ASP.NET MVC framework to validate HTML forms on the client and server-side using validation sets.
恐怕比我更精通MVC的人不得不谈论我们应该在架构中放置什么内容。
回答
我也只是在学习MVC框架,所以我不确定这有多大,但是据我了解,我们将在View上拥有一个表单,例如Edit.aspx。然后,此表单将向控制器发布到另一个操作方法,例如Update(),以传入我们在Edit.aspx中设置的表单内容作为参数。
Update(int id, string name, string foo)
我们可以在该方法中进行验证。如果一切都好,
return View("Item", yourObject)
回答
这是MVC中流程的概述:
- 帖子被路由到控制器上的"创建"操作
- 在操作方法中,使用发布的数据更新模型。
- 模型应进行自我验证。
- 控制器应读取该模型是否有效。
- 如果模型有效,则将其保存到数据库。重定向到/ show以呈现对象的show视图。
- 如果模型无效,则将表单值和错误消息保存在TempData中,然后再次重定向到New操作。用TempData中的数据填充表单字段,并显示错误消息。
验证框架将在此过程中为我们提供帮助。另外,我认为ASP.NET MVC团队正在为下一个预览版计划一个验证框架。
回答
Castle项目中有Castle.Components.Validator模块。它非常敏捷和强大。它基于模型属性(或者任何其他来源)生成验证规则,甚至可以使用jQuery,原型验证,fValidate等来生成JS验证。
当然,将验证器抽象到IValidationEngine接口之后是明智的。
回答
我们可能想看一下ScottGu关于ASP.Net prev 5的最新文章。它介绍了一个非常有趣的验证示例:
http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx
回答
据我所知,每个人仍在尝试找出"标准"方式。也就是说,可以肯定地查看Phil Haack和Scott Guthrie在MVC上的最新文章,我们会发现一些有趣的信息,了解它们的工作方式。当我自己玩游戏时,我为生成的LinqToSql数据类创建了ModelBinder。我们可以查看这篇文章,以了解如何组合基本的ModelBinder:
ASP.Net MVC模型绑定器
如果我们创建了" Product" ModelBinder,则在操作中只需声明操作即可,如下所示:
public ActionResult新增(产品)
只要我们正确构建了模型绑定程序,就会将发布的数据分配给对象属性。
之后,我们可以在GetValue()方法中实现所需的任何验证,无论是使用异常,正则表达式还是可以进行如下调用:
(ModelStateDictionary_name).AddModelError(" form_element_id"," entered_value"," error_message");
然后,我们可以在视图中抛出<%= Html.ValidationSummary()%>以显示所有错误。
对于客户端验证,我只使用了jQuery。在完成基本样本设置之后,尽管可以将部分内容与Partial Views和Ajax调用结合起来进行一些有趣的事情。