xVal 错误消息出现两次
-
12-09-2019 - |
题
我正在尝试使用 ASP.NET MVC 2 Preview 1 项目设置 xVal。我基本上遵循以下示例 http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ 严格来说(到目前为止仅限服务器端)。
我注释了一个 BlogPost 实体,下面是 Post 操作:
[HttpPost]
public ActionResult Index(BlogPost b)
{
try
{
_blogService.Insert(b);
}
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "");
}
return (View(b));
}
这是服务方法:
public void Insert(BlogPost post)
{
var errors = DataAnnotationsValidationRunner.GetErrors(post);
if(errors.Any())
{
throw new RulesException(errors);
}
_blogRepo.Insert(post);
}
(请注意,DataAnnotationsValidationRunner 是示例博客文章中的逐字记录)。当我提交完全无效的 BlogPost 表单时,我收到以下验证错误列表:
- 需要一个数值。
- 请输入标题
- 请输入发布日期
- 请输入一些内容
- 请输入标题
- 请输入发布日期
- 请输入一些内容
我什至不知道第一条消息的用途,但正如您所看到的,其他错误出现了两次。我究竟做错了什么?或者这是 MVC V2 的问题?
解决方案
从 ASP.Net MVC 2 Preview 1 开始,我们现在获得开箱即用的 DataAnnotation 验证支持,所以我猜您的问题是,当 ModelBinder 逻辑运行时,它正在应用 DataAnnotation 规则:
public ActionResult Index(BlogPost b) //Create BlogPost object and apply rules
然后使用您的 XVal 逻辑再次请求检查:
var errors = DataAnnotationsValidationRunner.GetErrors(post);
它们以相同的顺序重复的事实证明了这一点。
您的代码在 MVC 版本 1 中可以正常工作,如下所示 公共 ActionResult 索引(BlogPost b) 不会运行 DataAnnotation 规则。我没有读过任何地方是否可以关闭新的 DataAnnotation 逻辑并仅使用 XVal。
有关于此的更多信息位于 Scott 的帖子预览 1
要找出第一项是什么,请运行调试并检查 ModelState 上有哪些错误,因为这将告诉您错误与对象上的哪个属性相关。
[HttpPost]
public ActionResult Index(BlogPost b)
{
try
{
_blogService.Insert(b); //Add breakpoint here and check ModelState
}
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "");
}
return (View(b));
}
不隶属于 StackOverflow