Asp.net mvc ASP.NET MVC模型验证错误本地化上下文

Asp.net mvc ASP.NET MVC模型验证错误本地化上下文,asp.net-mvc,data-annotations,modelstate,asp.net-mvc-validation,model-validation,Asp.net Mvc,Data Annotations,Modelstate,Asp.net Mvc Validation,Model Validation,首先,我必须说,我了解ASP.NET MVC4中基于数据注释的模型验证是如何工作的,并且我已经使用DataAnnotationsModelValidatorProvider成功地实现了它。所以我不需要帮助来设置它 但当涉及到HtmlHelpers时,我正在努力找出错误消息的上下文。通过说上下文,我指的是我们正在讨论的错误。哪个属性返回了错误 我能得到的是错误的键和当前的错误消息,但从编程的角度来看,至少我知道,没有任何东西可以传达我们所说的错误。无论它是必需的属性还是其他属性,我都无法找到区分它

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

但当涉及到
HtmlHelpers
时,我正在努力找出错误消息的上下文。通过说
上下文
,我指的是我们正在讨论的错误。哪个属性返回了错误

我能得到的是错误的
和当前的
错误消息
,但从编程的角度来看,至少我知道,没有任何东西可以传达我们所说的错误。无论它是
必需的
属性还是其他属性,我都无法找到区分它们的方法

让我们稍微打开场景。我有自定义的
htmlHelper
来呈现
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>
var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors});
请提供名字
现在,我有了一个jQuery插件来处理和持久化
contenteditable
元素中的更改,并将它们持久化到后端。但是,用户界面没有任何信息可以说明我们正在讨论的错误消息。人类可以很容易地看到它是
RequiredAttribute
,但是从编程角度来看,没有数据可以将它与一些
MinLengthAttribute
区分开来

在这个场景中,如果我简单地使用
data valmsg for=“firstName”
作为本地化的键,那么对于与相同属性相关的所有错误,都会返回相同的错误消息

将其取整

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


我可以想出很多方法来“一起破解”,但我想使用
ModelState
和MVC提供的任何东西。如果要写一个定制的
modelvalidateprovider
,那么我完全愿意。只要这是最好、最可持续的方式。我完全支持现在多做,以后少做而不是现在攻击它,然后永远攻击它以保持它工作

您能否提供一些背景信息,了解是哪条规则触发了验证错误,这可能是您试图做一些不应该做的事情吗

一般来说,我使用FluentValidation()代替数据注释验证有很多原因,比如消除模型混乱、单元测试验证逻辑,从而允许包括业务逻辑在内的更复杂的验证。如果您可以免费使用第三方库,我会看一看,因为它总是解决了我过去遇到的任何验证问题

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

RuleFor(modelname => modelname.FirstName).NotEmpty().WithMessage("lease provide first name");

即使实现
modelvalidateprovider
也没有帮助,它只是一种基于模型元数据提供
modelvalidater
s的机制。在控制器操作中的模型绑定过程中,调用模型验证程序时,结果仅为
ModelValidationResult
,其中仅包含
MemberName
和文本
消息

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

<span contenteditable="true" data-valmsg-for="firstName" data-valmsg-replace="Please provide first name" class="field-validation-error">Please provide first name</span>
var modelErrors = ModelState.Where(m => m.Value.Errors.Count > 0).Select(m => new { Name=m.Key , Errors=m.Value.Errors});

通过对照ValidatorProvider错误消息检查modelErrors中每个键的错误消息,您可以找出错误属于哪个验证器。

这对我来说是一个非常有趣的问题。使用反射进行黑客攻击的基础是什么?和您一样,“通过反射您可以做到这一点”这句话通常意味着为不可避免的维护不善的代码设置自己。我将密切关注这一点……您是否需要客户端或服务器端的数据?您的进度有任何更新吗?我将尽快发布我当前基于反射的实现,因为我们没有得到任何可以被视为最佳实践的东西。我也在考虑将此作为请求提交给MVC团队。谢谢。但是我已经在使用一种肮脏的方式通过反射来获取任何正在验证的模型属性的ValidationAttribute。它正在查找属性的ErrorResourceKey,该属性输出与当前在ModelState中填充的errorMessage相同的errorMessage。这样,我可以连接属性名和错误资源键,以获得属性错误的唯一键。