我从 Paul 的那篇博客文章中得到了评论,并将其修改为使用所有已知的 MVC 验证适配器,而不仅仅是必需的(基本上模仿了框架本身的大部分内容)。它如何显示错误消息并使用我们已经拥有的东西有点毛茸茸,我为 MVC Contrib 实现了一个补丁来使用它,但最后我现在放弃了,直到 MVC3 完成和 MVC Contrib 反对它。当即将发布更新版本时,没有必要经历所有这些。
这是我最终得到的(FluentViewPage<T>
是我们添加行为的地方):
public class ClientsideValidationBehavior<T> : IBehavior<IMemberElement> where T : class
{
private readonly FluentViewPage<T> _viewPage;
public ClientsideValidationBehavior(FluentViewPage<T> viewPage)
{
_viewPage = viewPage;
}
public void Execute(IMemberElement element)
{
var attribute = element.GetAttribute<ValidationAttribute>();
if (attribute == null)
{
return;
}
var formContext = _viewPage.ViewContext.FormContext;
var fieldMetadata = formContext.GetValidationMetadataForField(UiNameHelper.BuildNameFrom(element.ForMember), true);
var modelMetadata = ModelMetadata.FromStringExpression(element.ForMember.Member.Name, _viewPage.ViewData);
var validators = ModelValidatorProviders.Providers.GetValidators(modelMetadata, _viewPage.ViewContext);
validators.SelectMany(v => v.GetClientValidationRules()).ForEach(fieldMetadata.ValidationRules.Add);
fieldMetadata.ValidationMessageId = element.ForMember.Member.Name + "_Label";
}
}
希望对一些人有所帮助。