Asp.net mvc 在ASP.NET MVC框架中验证发布的表单数据
我一直在玩ASP.NETMVC框架,有一件事让我很困惑,那就是我该如何对发布的表单数据进行服务器端验证。我假设我没有回发到同一个URL,但是如果我没有回发,我如何用输入的数据和错误消息重新显示表单?此外,验证逻辑应该放在哪里?在模型中还是在控制器中?这似乎是web表单功能更强的少数几个领域之一(我错过了验证控件)。您看过这个吗? 引自该页 验证器工具包提供了一组 新ASP.NET MVC的验证程序列表 验证HTML表单的框架 客户端和服务器端使用 验证集Asp.net mvc 在ASP.NET MVC框架中验证发布的表单数据,asp.net-mvc,validation,Asp.net Mvc,Validation,我一直在玩ASP.NETMVC框架,有一件事让我很困惑,那就是我该如何对发布的表单数据进行服务器端验证。我假设我没有回发到同一个URL,但是如果我没有回发,我如何用输入的数据和错误消息重新显示表单?此外,验证逻辑应该放在哪里?在模型中还是在控制器中?这似乎是web表单功能更强的少数几个领域之一(我错过了验证控件)。您看过这个吗? 引自该页 验证器工具包提供了一组 新ASP.NET MVC的验证程序列表 验证HTML表单的框架 客户端和服务器端使用 验证集 我担心比我更精通MVC的人会告诉你应该
我担心比我更精通MVC的人会告诉你应该把东西放在架构中的什么地方。我也只是在学习MVC框架,所以我不确定这有多好,但据我所知,你会在诸如Edit.aspx之类的视图上有一个表单。然后,此表单将发送到控制器,并发送到另一个操作方法,如Update(),将您在Edit.aspx中设置的表单内容作为参数传入
Update(int id, string name, string foo)
您可以在该方法中进行验证。如果一切顺利
return View("Item", yourObject)
下面是MVC中流程的概述:
- 用户填写表单并将其发布到/创建
- post将路由到控制器上的“创建”操作
- 在操作方法中,使用发布的数据更新模型
- 你的模型应该自我验证
- 控制器应读取模型是否有效
- 如果模型有效,请将其保存到数据库中。重定向到/show以渲染对象的显示视图
- 如果模型无效,请将表单值和错误消息保存在TempData中,然后再次重定向到新操作。用TempData中的数据填充表单字段,并显示错误消息
当然,将验证器抽象到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时,它看起来像是页面回发到自己。我想知道他们是如何实施验证的。