10

我一直在使用 ASP.NET MVC 框架,而真正让我困惑的一件事是我打算如何对已发布的表单数据进行服务器端验证。我假设我没有回发到同一个 URL,但如果我不发回,我如何重新显示带有输入数据和错误消息的表单?另外,验证逻辑应该去哪里?在模型或控制器中?这似乎是 Web 表单强大得多的少数几个领域之一(我错过了验证控件)。

4

6 回答 6

12

以下是 MVC 中的流程概述:

  1. /new - 呈现您的“新”视图,其中包含供用户填写的表单
    • 用户填写表格并将其发布到 /create
    • 帖子被路由到控制器上的 Create 操作
    • 在您的操作方法中,使用已发布的数据更新模型。
    • 您的模型应该自我验证。
    • 如果模型有效,您的控制器应该读取。
    • 如果模型有效,请将其保存到您的数据库中。重定向到 /show 以呈现对象的显示视图。
    • 如果 Model 无效,请将表单值和错误消息保存在 TempData 中,然后再次重定向到 New 操作。使用 TempData 中的数据填写表单字段并显示错误消息。

验证框架将在此过程中为您提供帮助。另外,我认为 ASP.NET MVC 团队正在为下一次预览计划一个验证框架。

于 2008-08-13T23:15:32.277 回答
4

您可能想看看 ScottGu 为 ASP.Net prev 5 发布的最新帖子。它介绍了一个非常有趣的验证示例:

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

于 2008-09-05T12:29:11.297 回答
3

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

ASP.Net MVC 模型绑定器

如果您创建了一个“产品”ModelBinder,那么在您的操作中,您只需像这样声明该操作:

public ActionResult New(Product prod)

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

之后在您的 GetValue() 方法中,您可以实现任何您想要的验证,无论是使用异常、正则表达式还是任何您可以拨打电话的方式:

(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");

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

对于客户端验证,我只使用了 jQuery。在获得基本示例设置后,您可以开始做一些有趣的事情,将所有这些与部分视图和 Ajax 调用结合起来。

于 2008-09-19T13:50:59.240 回答
2

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

从页面引用

Validator Toolkit 为新的 ASP.NET MVC 框架提供了一组验证器,以使用验证集在客户端和服务器端验证 HTML 表单。

恐怕比我更精通 MVC 的人不得不谈论你应该在架构中的哪个位置放置东西。

于 2008-08-13T19:59:49.783 回答
0

我也只是在学习 MVC 框架,所以我不确定这有多好,但据我了解,您将在诸如 Edit.aspx 之类的视图上拥有一个表单。然后,此表单将向控制器发布到另一个操作方法,例如 Update(),将您在 Edit.aspx 中设置的表单内容作为参数传递。

Update(int id, string name, string foo)

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

return View("Item", yourObject)
于 2008-08-13T20:58:00.540 回答
0

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

于 2008-08-22T12:36:40.987 回答