验证ASP.NET MVC框架中的已发布表单数据

时间:2008-08-13 19:45:34

标签: asp.net-mvc validation

我一直在玩ASP.NET MVC框架,让我感到困惑的一件事就是如何对发布的表单数据进行服务器端验证。我认为我不会回发到同一个网址,但如果不这样做,我如何使用输入的数据和错误消息重新显示表单?此外,验证逻辑应该在哪里?在模型或控制器?这似乎是Web表单更强大的少数领域之一(我错过了验证控件)。

6 个答案:

答案 0 :(得分:12)

以下是MVC中流程的概述:

  1. / new - 渲染包含用户填写表单的“新”视图
    • 用户填写表单并将其发布到/ create
    • 帖子将路由到您控制器上的“创建”操作
    • 在您的操作方法中,使用已发布的数据更新模型。
    • 您的模型应该验证自己。
    • 如果模型有效,您的控制器应该读取。
    • 如果模型有效,请将其保存到数据库。重定向到/ show以呈现对象的节目视图。
    • 如果模型无效,请将表单值和错误消息保存在TempData中,然后再次重定向到“新建”操作。使用TempData中的数据填写表单字段并显示错误消息。
  2. 验证框架将帮助您完成此过程。另外,我认为ASP.NET MVC团队正在为下一次预览计划验证框架。

答案 1 :(得分:4)

您可能想看一下ScottGu关于ASP.Net上一页的最新帖子5.它会介绍一个非常有趣的验证示例:

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

答案 2 :(得分:3)

据我所知,每个人都在试图找出“标准”的做法。那肯定是看看Phil Haack和Scott Guthrie关于MVC的最新帖子,你会发现一些关于他们如何做的有趣信息。当我为自己玩它时,我为我生成的LinqToSql数据类创建了一个ModelBinder。你可以查看这篇文章,了解如何组建一个基本的ModelBinder:

ASP.Net MVC Model Binder

如果你创建了一个“Product”ModelBinder,那么在你的行动中你只需要声明这样的动作:

public ActionResult New(Product prod)

模型绑定器将负责将发布的数据分配给对象属性,只要您已经正确构建它。

在你的GetValue()方法中,你可以实现你想要的任何验证,无论是使用异常,正则表达式,还是你可以调用的任何东西,如:

(ModelStateDictionary_name).AddModelError(“form_element_id”,“entered_value”,“error_message”);

然后你可以抛出一个<%= Html.ValidationSummary()%>在您的视图中显示所有错误。

对于客户端验证,我只使用了jQuery。在获得基本样本设置之后,您可以开始做一些有趣的事情,将所有这些与Partial Views和Ajax调用相结合。

答案 3 :(得分:2)

你看过这个吗? http://www.codeplex.com/MvcValidatorToolkit

从页面引用

  

Validator Toolkit提供了一个集合   新ASP.NET MVC的验证器   用于验证HTML表单的框架   客户端和服务器端使用   验证集。

我担心比我更精通MVC的人不得不谈论你应该把建筑物放在哪里。

答案 4 :(得分:0)

我只是在学习MVC框架,所以我不确定它是多么偏离,但据我所知,你会在View.aspx这样的View上有一个表单。然后,此表单将向控制器发送另一个操作方法,例如Update(),将您在Edit.aspx中设置的表单内容作为参数传递。

Update(int id, string name, string foo)

您可以在该方法中进行验证。如果一切正常,

return View("Item", yourObject)

答案 5 :(得分:0)

Castle项目中有Castle.Components.Validator个模块。它非常敏捷和强大。它基于模型属性(或任何其他源)生成验证规则,甚至能够使用jQuery,Prototype Validation,fValidate等生成JS验证。 当然,在IValidationEngine接口后面抽象验证器是明智的。