Некоторое время назад я спрашивал у всех подряд, нет ли на примете простого ASP.NET-контрола, который позволяет редактировать переданный ему объект. Вроде DetailsView, но с валидацией.
Ни у кого не оказалось. Зато не один человек сказал что-то вроде "найдешь - сообщи". Сообщаю - не нашел. Пришлось писать самому, благо делом оказалось простым, заняло всего пару-тройку часов.
Что получилось:
- Обработка объекта, естественно, делается с помощью рефлексии свойств этого объекта.
- Атрибуты ReadOnly и Browsable учитываются.
- Атрибуты DisplayName и Description учитываются.
- Для следующих типов генерируются следующие отображения:
Enum -> DropDownList; [Flags]Enum -> CheckBoxList; Boolean -> CheckBox; все остальное -> TextBox. - Для полей Enum'ов поддерживаются атрибуты Browsable и EnumDisplayName (юзер-френдли имя поля).
- Для полей, которые будут редактироваться с помощью текстового (и только для них) поля поддерживается валидация.
- Для валидации свойств используются атрибуты ValidateRequired, ValidateRange и ValidateCompare.
- Тексты валидаторов задаются в свойствах объекта.
- Для всех элементов формы редактирования (таблица, лейблы, валидаторы, поля значений) поддерживаются стили, которые можно задать в свойствах или использовать в скинах.
Иными словами, редактируемый класс может выглядеть так:
public enum MyEnum
{
[EnumDisplayName("Choice one")]
One = 1,
[EnumDisplayName("Choice two")]
Two= 2,
[EnumDisplayName("NO CHOICE")]
NoneOfThem = 4
}
public class TestEntry
{
[DisplayName("User's name")]
[Description("The name of the user")]
[ValidateRequired]
public string Name { get; set; }
[DisplayName("User's age")]
[Description("Age must be more than 20 and less than 45")]
[ValidateRequired, ValidateRange(20, 45)]
public int Age { get; set; }
[DisplayName("User's choice")]
public MyEnum Choice { get; set; }
[DisplayName("Man?")]
public bool IsMan { get; set; }
}
Для моих целей этой функциональности хватает с лихвой. Если кому-то будет полезно или интересно - можно что-нибудь подкрутить или добавить, там все очень просто :)
Код прилагаю.
[UPDATE]: Там, в коде, используются фичи из только что релизнувшегося .NET Framework 3.5. Как минимум там есть метод, расширяющий EnumConverter, по поводу остального не уверен, не проверял на 2.0. Так что не говорите мне, что оно не компилируется :) Переделать под 2.0, я думаю, 7 минут работы максимум.
AspNetObjectEditor.zip (5.74 kb)