Настройка проверки достоверности полей ASP.NET Dynamic Data

138

Систему метаданных, рассмотренную в предыдущей статье, можно использовать для настройки проверки достоверности полей данных. В последующих разделах приведены примеры проведения такой настройки.

Требование значения поля

Атрибут Required указывает на обязательность предоставления значения для данного поля. В приведенном ниже коде демонстрируется применение атрибута Required к столбцу UnitsInStock из файла кода Metadata.cs. С помощью свойства ErrorMessage определяется сообщение, которое будет отображаться пользователям, если они пытаются добавить запись без значения UnitsInStock:

public class ProductMetadata
{
    [DisplayName("В наличии")]
    [Required(ErrorMessage = "Вы должны ввести, сколько товара у вас есть в наличии")]
    public object UnitsInStock { get; set; }

    [DisplayName("Цена")]
    public object UnitPrice { get; set; }

    [ScaffoldColumn(false)]
    public object SupplierID { get; set; }
}

Обратите внимание, что это свойство используется вместе с атрибутом DisplayName. Чтобы протестировать проверку достоверности данных, выберите пункт Start Without Debugging в меню Debug, щелкните на ссылке таблицы Products, а затем - на ссылке Insert New Item (Вставить новый элемент) в нижней части страницы. Откроется страница Insert (Вставка); щелкните на кнопке Insert, не заполняя ни одно из полей. На странице отобразятся ошибки проверки достоверности вставляемых данных, как показано на рисунке ниже:

Ошибка проверки достоверности, сгенерированная с помощью атрибута Required

Как видите, возникли две ошибки проверки достоверности. Первая была выбрана системой динамических данных ASP.NET из схемы модели данных: столбец ProductName не допускает null-значений. Вторая ошибка возникает вследствие применения атрибута Required, который позволяет представить ограничения схемы без изменения модели данных или исходной базы данных.

Указание допустимого диапазона

Атрибут Range позволяет указывать диапазон допустимых значений полей для числовых типов. Ниже показано применение атрибута Range к столбцу UnitsInStock таблицы Products:

public class ProductMetadata
{
    [DisplayName("В наличии")]
    [Required(ErrorMessage = "Вы должны ввести, сколько товара у вас есть в наличии")]
    [Range(0, 100)]
    public object UnitsInStock { get; set; }

    [DisplayName("Цена")]
    public object UnitPrice { get; set; }

    [ScaffoldColumn(false)]
    public object SupplierID { get; set; }
}

Здесь указано, что допустимыми являются только значения из диапазона от 1 до 100. При попытке создания или редактирования записи в таблице Products и предоставления значения, которое выходит за рамки этого диапазона, отображается ошибка проверки достоверности:

Ошибка достоверности, связанная с диапазоном

Настройка проверки достоверности с помощью методов расширяемости

Развернув элемент Northwind.dbml в папке App_Code, вы увидите файл кода Northwind.designer.cs. Он содержит классы, сгенерированные LINQ to SQL. Именно эта модель данных управляет приложением динамических данных. Каждый тип содержит раздел, помеченный как Extensibility Method Definitions (Определения методов расширяемости). Эти методы будут использоваться для выполнения проверки достоверности специального поля. Ниже перечислены определения частичных методов для типа Product:

partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnProductIDChanging(int value);
partial void OnProductIDChanged();
partial void OnProductNameChanging(string value);
partial void OnProductNameChanged();
partial void OnSupplierIDChanging(System.Nullable value);
partial void OnSupplierIDChanged();
partial void OnCategoryIDChanging(System.Nullable value);
partial void OnCategoryIDChanged();
partial void OnQuantityPerUnitChanging(string value);
partial void OnQuantityPerUnitChanged();
partial void OnUnitPriceChanging(System.Nullable value);
partial void OnUnitPriceChanged();
partial void OnUnitsInStockChanging(System.Nullable value);
partial void OnUnitsInStockChanged();
partial void OnUnitsOnOrderChanging(System.Nullable value);
partial void OnUnitsOnOrderChanged();
partial void OnReorderLevelChanging(System.Nullable value);
partial void OnReorderLevelChanged();
partial void OnDiscontinuedChanging(bool value);
partial void OnDiscontinuedChanged();

Интерес представляют методы, которые имеют форму On<ИмяПоля>Changing. Если их реализовать в частичных классах, они будут вызываться, когда пользователь предоставляет значение поля. Предположим, что применение атрибута Range в предыдущем примере требуется дополнить гарантией обеспечения использования только четных чисел в поле UnitsInStock. Для этого нужно реализовать метод расширяемости для этого поля. Он имеет следующую сигнатуру:

partial void OnUnitsInStockChanging(System.Nullable<short> value);

Добавьте реализацию этого метода в класс Product, созданный в файле кода Metadata.cs:

[MetadataType(typeof(ProductMetadata))]
public partial class Product
{
    partial void OnUnitsInStockChanging(short? value)
    {
        if (value % 2 == 1) throw new ValidationException("Количество товара должно быть четным");
    }
}

public class ProductMetadata
{
    // ...
}

Если в своей реализации метода OnUnitsInStockChanging вы сгенерируете исключение, оно будет использоваться для выдачи пользователю сообщения об ошибке проверки достоверности. Сохраните изменения в файле Metadata.cs и запустите приложение, выбрав пункт Start Without Debugging в меню Debug.

Щелкните на ссылке таблицы Products, а затем на ссылке Edit для одной из строк данных. В качестве значения поля "В наличии" установите нечетное число и щелкните на ссылке Update. Если введенное значение выходит за рамки диапазона, указанного в метаданных, отобразится ошибка проверки достоверности диапазона. Если введенное значение находилось в допустимом диапазоне, но было нечетным, отобразится сообщение, переданное в исключение, которое сгенерировано в методе OnUnitsInStockChanging:

 Ошибка проверки достоверности, созданная методами расширяемости
Пройди тесты
Лучший чат для C# программистов