я использую слой бизнес-объектов, который включает метод проверки
public bool ValidateData(IList<string> errs)
сообщения об ошибках добавляются в коллекцию в виде строк, отформатированных из шаблонов программных констант (очевидно, глобализация не является проблемой), например, «{0} не может быть пустым, введите значение для {0}», где {0} - это имя поля
один и тот же бизнес-уровень работает для веб-приложений и приложений для настольных компьютеров
РЕДАКТИРОВАТЬ: коллекция сообщений об ошибках передается обратно в winform в метке сообщения об ошибке или в веб-форму в метке сообщения об ошибке. (JavaScript не требуется)
Я также использовал вариант этого, который принимает IDictionary, где первая строка является именем поля, а вторая строка является сообщением об ошибке, а вспомогательная функция находит элемент формы, связанный с именованным полем для выделения
В общем, я использую примерно одинаковый шаблон в большинстве прикладных систем, в зависимости от потребностей клиента