Так как нет готового решения и нет опубликованных ответов, я поделюсь тем, что реализовал. Я не влюблен в этот подход, но он работает для меня.
Обзор
Основной подход состоит в том, чтобы страница ASP.NET заполняла сопоставление между свойствами объектов DataContract и ClientId проверяемого элемента управления. При возникновении ошибки проверки ClientId возвращается из службы на страницу asp.net как часть FaultContract. Затем детали из FaultException извлекаются; страница ASP.NET извлекает ClientId элемента управления, вызвавшего ошибку, и могут быть предприняты соответствующие действия (например, изменить внешний вид элемента управления или установить текст в валидаторе).
Подробнее
Все объекты DataContract наследуются от базового класса, который предоставляет словарь. Этот словарь используется для сопоставления свойств объекта элементам управления ASP.NET. В словаре ключ - это имя свойства объекта DataContract, а значение - ClientId элемента управления. Перед вызовом службы клиент должен прикрепить словарь к объекту DataContract.
Когда ValidationResult создается библиотекой предприятия, она содержит свойство Target, которое является объектом, который был проверен. ValidationResult также содержит свойство с именем key, которое является именем свойства из целевого объекта, который был проверен. Ключ ValidationResult также является ключом в словаре, который был задан на странице ASP.NET перед вызовом службы.
С помощью ключа ValidationResult предоставляемую ASP.NET информацию (ClientId) можно извлечь из цели ValidationResult. Затем информация добавляется в качестве тега результата ValidationResult. К сожалению, Tag - это свойство только для чтения, поэтому его необходимо установить, создав новый ValidationResult и передав его в конструктор.
Коллекция ValidationResults затем преобразуется в ранее существующую коллекцию CustomValidationResults (которая выглядит точно так же, как ValidationResult), которую нам нужно было использовать. Затем CustomValidationResults добавляются в пользовательский ValidationFault и генерируется исключение FaultException.
Затем ValidationFaults извлекаются из FaultException на странице ASP.NET. ValidationFault содержит ClientId элемента управления, который связан с ошибкой, поэтому на странице можно выбрать отображение сообщений по своему усмотрению.