4

首先,我必须说我了解基于数据注释的模型验证在 ASP.NET MVC4 中是如何工作的,并且我已经使用DataAnnotationsModelValidatorProvider. 所以我不需要帮助来设置它。

但是当它归结为 时HtmlHelpers,我正在努力尝试找出错误消息的上下文。并且说context,我的意思是我们正在谈论的错误。哪个属性返回了错误?

我能得到的是Key错误和当前的错误,ErrorMessage但以编程方式,至少我知道,没有什么可以传达我们正在谈论的错误。无论是Required属性还是其他属性,我都找不到如何区分它们的方法。

让我们稍微打开场景。我有自定义HtmlHelpers渲染ContentEditable元素。例如Html.ContentEditableValidationMessageFor(m => m.firstName);. 它将输出如下内容:

<span contenteditable="true" data-valmsg-for="firstName" data-valmsg-replace="Please provide first name" class="field-validation-error">Please provide first name</span>

现在,我确实有一个 jQuery 插件来处理和持久化contenteditable元素中的更改,并将它们持久化到后端。但是,UI 没有任何内容可以说明我们正在谈论的错误消息。人类可以很容易地看到它是RequiredAttribute,但在编程上没有数据可以将它与某些数据区分开来MinLengthAttribute

在这种情况下,如果我只是将data-valmsg-for="firstName"用作本地化的键,那么对于与同一属性有关的所有错误都会返回相同的错误消息。

四舍五入

什么时候最好的做法ModelState是为 ModelError 发出唯一的 ID?考虑到我正在使用 ASP.NET MVC4 和DataAnnotationsModelValidatorProvider.

我可以想出很多“一起破解”的方法,但我想使用ModelStateMVC 提供的任何东西。如果这一切都归结为编写一个 custom ModelValidatorProvider,那么我完全愿意接受它。只要它是最好和最可持续的方式。我完全赞成现在做的比现在做的多,以后做的少,然后永远破解以保持工作

4

2 回答 2

4

您能否提供一些关于需要知道哪个规则触发了验证错误的上下文,这可能是您尝试做一些您不应该做的事情的情况吗?

一般来说,出于多种原因,我使用 FluentValidation ( http://fluentvalidation.codeplex.com/wikipage?title=mvc ) 来代替数据注释验证,去杂乱模型,单元测试验证逻辑,允许更复杂的验证,包括业务逻辑。如果您可以免费使用 3rd 方库,我会看看它,因为它总是解决我过去遇到的任何验证问题。

它允许您编写通过流式 API 处理模型验证的 c# 代码。它有一个 MVC 扩展,可以为您连接一切,因此除了创建模型验证类之外,从那时起几乎没有影响。上面的代码片段的一个例子是......

RuleFor(modelname => modelname.FirstName).NotEmpty().WithMessage("lease provide first name");
于 2013-04-08T11:39:24.963 回答
2

即使实现ModelValidatorProvider也无济于事,它只是一种ModelValidator基于模型元数据提供s的机制。ModelValidator在调用控制器动作中的模型绑定过程时,结果只是ModelValidationResult包含MemberName一个文本Message

我认为有一种肮脏的方法可以通过检查如下错误消息来找出哪个 ModelValidator 失败:

var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors});

通过针对 ValidatorProvider 错误消息检查 modelErrors 中每个键的 ErrorMessage 错误消息,您可以找出错误属于哪个 Validator。

于 2013-04-08T13:47:53.490 回答