在 ASP.NET MVC 框架中验证已发布的表单数据
Posted
技术标签:
【中文标题】在 ASP.NET MVC 框架中验证已发布的表单数据【英文标题】:Validating posted form data in the ASP.NET MVC framework 【发布时间】:2010-09-05 20:02:18 【问题描述】:我一直在使用 ASP.NET MVC 框架,而真正让我感到困惑的一件事是我打算如何对已发布的表单数据进行服务器端验证。我想我不会回发到同一个 URL,但如果我不发回,我如何重新显示带有输入数据和错误消息的表单?另外,验证逻辑应该去哪里?在模型或控制器中?这似乎是少数几个 Web 表单更强大的领域之一(我错过了验证控件)。
【问题讨论】:
【参考方案1】:以下是 MVC 中的流程概述:
-
/new - 呈现您的“新”视图,其中包含一个供用户填写的表单
用户填写表单并将其发布到 /create
帖子被路由到控制器上的创建操作
在您的操作方法中,使用发布的数据更新模型。
您的模型应该自我验证。
您的控制器应该读取模型是否有效。
如果模型有效,请将其保存到您的数据库中。重定向到 /show 以呈现对象的显示视图。
如果模型无效,请将表单值和错误消息保存在 TempData 中,然后再次重定向到新建操作。使用 TempData 中的数据填写表单字段并显示错误消息。
验证框架将帮助您完成此过程。另外,我认为 ASP.NET MVC 团队正在为下一次预览计划一个验证框架。
【讨论】:
Lance,TempData 存储桶是特定于该请求的吗?显然,如果它是基于会话的并且多个请求试图将数据存储在同一个存储桶中,则会产生问题。另外,使用 TempData 是一种黑客行为吗?这是其他 MVC 框架解决问题的方式吗? 优秀的总结!举个例子就好了 好总结!我发现的唯一问题是我希望能够验证数据类型,并且在将表单数据传递给模型之前我不能这样做,因为它会在创建它时抛出异常。有什么好办法吗? TryUpdateModel() 将获取您的表单数据,并尝试将其放入您的对象中。只需使用 FormData 作为控制器的参数而不是对象类型。另一种选择是构建自定义模型绑定器。更多信息:hanselman.com/blog/…【参考方案2】:您可能想看看 ScottGu 为 ASP.Net prev 5 发布的最新帖子。它介绍了一个非常有趣的验证示例:
http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx
【讨论】:
【参考方案3】:据我所知,每个人仍在试图找出“标准”的做法。也就是说,请务必查看 Phil Haack 和 Scott Guthrie 在 MVC 上的最新帖子,您会发现一些关于他们如何做的有趣信息。当我自己玩弄它时,我为我生成的 LinqToSql 数据类创建了一个 ModelBinder。您可以查看这篇文章,了解如何组装一个基本的 ModelBinder:
ASP.Net MVC Model Binder
如果您创建了一个“产品”ModelBinder,那么在您的操作中,您只需像这样声明该操作:
public ActionResult New(Product prod)
并且模型绑定器将负责将发布的数据分配给对象属性,只要您已经正确构建它。
之后,在您的 GetValue() 方法中,您可以实现任何您想要的验证,无论是使用异常、正则表达式还是任何您可以调用的方法:
(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");
然后你可以在你的视图中抛出一个 来显示你所有的错误。
对于客户端验证,我只使用了 jQuery。在您获得基本示例设置后,您可以开始做一些有趣的事情,将所有这些与部分视图和 Ajax 调用结合起来。
【讨论】:
【参考方案4】:你看过这个吗? http://www.codeplex.com/MvcValidatorToolkit
引自页面
验证器工具包提供了一套 新的 ASP.NET MVC 的验证器 验证 html 表单的框架 客户端和服务器端使用 验证集。
恐怕比我更精通 MVC 的人会不得不谈论你应该在架构中的什么位置放置东西。
【讨论】:
我确实看过 CodePlex 项目,但我对我所看到的(当时)印象不深。也许现在好多了。我再看看。显然,Jeff 和团队必须在 *** 中验证表单数据。当我查看 Ask a Question 页面的 HTML 时,看起来页面回发给自己。我想知道他们是如何实施验证的。【参考方案5】:我也只是在学习 MVC 框架,所以我不确定这有多好,但据我了解,您会在诸如 Edit.aspx 之类的视图上拥有一个表单。然后,此表单将向控制器发布到另一个操作方法,例如 Update(),将您在 Edit.aspx 中设置的表单内容作为参数传递。
Update(int id, string name, string foo)
您可以在该方法中进行验证。如果一切正常,
return View("Item", yourObject)
【讨论】:
【参考方案6】:Castle 项目中有Castle.Components.Validator 模块。它非常敏捷和强大。它基于模型属性(或任何其他来源)生成验证规则,甚至能够使用 jQuery、Prototype Validation、fValidate 等生成 JS 验证。 当然,将验证器抽象到 IValidationEngine 接口后面是明智的。
【讨论】:
以上是关于在 ASP.NET MVC 框架中验证已发布的表单数据的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net MVC 5 Jquery 验证不适用于带有提交事件的 ajax 帖子,显示为有效表单
ASP.NET MVC 表单身份验证域属性在 Firefox 中中断登录
ASP.NET Core 5 MVC:在模态窗口之前验证表单