Asp.net mvc 在ASP.NET MVC框架中验证发布的表单数据

Asp.net mvc 在ASP.NET MVC框架中验证发布的表单数据,asp.net-mvc,validation,Asp.net Mvc,Validation,我一直在玩ASP.NETMVC框架,有一件事让我很困惑,那就是我该如何对发布的表单数据进行服务器端验证。我假设我没有回发到同一个URL,但是如果我没有回发,我如何用输入的数据和错误消息重新显示表单?此外,验证逻辑应该放在哪里?在模型中还是在控制器中?这似乎是web表单功能更强的少数几个领域之一(我错过了验证控件)。您看过这个吗? 引自该页 验证器工具包提供了一组 新ASP.NET MVC的验证程序列表 验证HTML表单的框架 客户端和服务器端使用 验证集 我担心比我更精通MVC的人会告诉你应该

我一直在玩ASP.NETMVC框架,有一件事让我很困惑,那就是我该如何对发布的表单数据进行服务器端验证。我假设我没有回发到同一个URL,但是如果我没有回发,我如何用输入的数据和错误消息重新显示表单?此外,验证逻辑应该放在哪里?在模型中还是在控制器中?这似乎是web表单功能更强的少数几个领域之一(我错过了验证控件)。

您看过这个吗?

引自该页

验证器工具包提供了一组 新ASP.NET MVC的验证程序列表 验证HTML表单的框架 客户端和服务器端使用 验证集


我担心比我更精通MVC的人会告诉你应该把东西放在架构中的什么地方。

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

Update(int id, string name, string foo)
您可以在该方法中进行验证。如果一切顺利

return View("Item", yourObject)

下面是MVC中流程的概述:

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

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

    您可能想看看ScottGu针对ASP.Net prev 5的最新帖子。它遍历了一个非常有趣的验证示例:


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

    在您的操作中,如果您已经创建了一个“产品”ModelBinder,那么您只需声明如下操作:

    公共行动结果新产品(产品生产)

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

    之后,在GetValue()方法中,您可以实现任何您想要的验证,无论是使用exception、regex还是任何您可以进行如下调用的验证:

    (ModelStateDictionary\u name).AddModelError(“表单元素\u id”、“输入的\u值”、“错误消息”)

    然后您可以在视图中抛出一个图标来显示所有错误


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

    Lance,TempData bucket是否特定于该请求?显然,如果它是基于会话的,并且多个请求试图将数据存储在同一个bucket中,则会产生问题。另外,使用TempData是一种黑客行为吗?这就是其他MVC框架解决问题的方式吗?非常好的总结!将是伟大的一个例子很好的总结!我发现的唯一问题是,我希望能够验证数据类型,但在将表单数据传递给模型之前,我不能这样做,因为它在创建表单数据时会抛出异常。有什么好办法吗?TryUpdateModel()将获取表单数据,并尝试将其放入对象中。只需将FormData用作控制器的参数,而不是对象类型。另一个选项是构建自定义模型绑定器。更多信息:我确实看了CodePlex项目,但我对(当时)看到的东西没有印象。也许现在好多了。我再看看。显然,Jeff和团队必须在StackOverflow中验证表单数据。当我查看页面的HTML时,它看起来像是页面回发到自己。我想知道他们是如何实施验证的。