Здравствуйте, Козьма Прутков, Вы писали:
КП>Друзья, объясните бестолковому, как правильно производить валидацию с учетом того, что используется Domain Model или хотя бы Table Module. В поиск просьба носом не тыкать: там я уже все почитал, что нашел.
КП>Проблема: есть пользовательский ввод. Этот ввод нужно валидировать, причем не только на форматы и длины строк (это-то примитивно и нормально решается UI) но и диапазоны (в процедуре проверки которых может участвовать множество объектов), и валидные переходы (например, состояний объекта) и т.д. Понятное дело, требуется гибкость на том уровне, что пользователю по его команде сразу показать все его ошибки (естественно, если проверки определены; так например не стоит же говорить о несоблюдении диапазонов если формат данных неверный), с другой стороны — крайне разумно выглядит отсутствие дублирования кода (ведь объект домена, по идее, не должен позволять перевести себя в некорректное состояние, то есть уже в UI без дублирования не вынесешь).
КП>Если не жалко, поделитесь идеями, как организовать подобную функциональность, либо ткните пальчиком в книжку, где доходчиво написано.
КП>Заранее спасибо.
В моем инструменте генерации кода (
http://www.rsdn.ru/forum/?mid=1057392Автор: AlexandrV
Дата: 05.03.05
), формируется примерно такой код на уровне UI:
protected virtual string Category_IsValidate()
{
string strResult = "";
if (textboxCategory.Text == "")
{
strResult = "Поле не может быть пустым!";
return strResult;
}
return strResult;
}
private void textboxCategory_Validating(object sender, CancelEventArgs e)
{
string rez = Category_IsValidate();
if (rez != "")
{
this.objErrorProvider.SetError(textboxCategory, rez);
}
else
{
this.objErrorProvider.SetError(textboxCategory, "");
}
}
такой код генерится для каждого контрола на форме (плюс если поле не стринговое то проверяется возможность парсинга, например Int32.Parse (...) ).
При закрытии формы есть также общая проверка, выглядит примерно так:
protected override void FormClosing(System.ComponentModel.CancelEventArgs e)
{
try
{
if (blnNeedValidate)
{
string strCategory = Category_IsValidate();
if (strCategory != "")
{
e.Cancel = true;
System.Windows.Forms.MessageBox.Show(strCategory, "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
return;
}
}
}
finally
{
base.FormClosing(e);
}
}