Я получил комментарий от этой статьи блога, работающего Пола, и изменил его, чтобы использовать все известные адаптеры валидации MVC вместо только Обязательного (в основном имитируя большую часть того, что находится в самой платформе).Это выглядит немного странно из-за того, как он отображает сообщение об ошибке и работает с тем, что у нас уже есть, и я реализовал патч для MVC Contrib, чтобы работать с ним, но в итоге я сейчас отказываюсь, пока MVC3 не будет завершен и MVCContrib строит против этого.Нет смысла проходить через все это, когда скоро выйдет обновленный релиз.
Вот что я закончил (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";
}
}
Надеюсь, что это поможетнекоторые из них.