![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Атрибуты. Для UserView будем использовать для валидации атрибуты.
Для UserView будем использовать для валидации атрибуты. Добавим сборку: using System.ComponentModel.DataAnnotations; public class UserView { public int ID { get; set; }
[Required(ErrorMessage=" Введите email")] public string Email { get; set; }
[Required(ErrorMessage=" Введите пароль")] public string Password { get; set; }
[Compare(" Password", ErrorMessage=" Пароли должны совпадать")] public string ConfirmPassword { get; set; }
public string Captcha { get; set; }
public string AvatarPath { get; set; } } Проверяем: Мы смогли описать тут 5 из 6 правил валидации. Правила, касающегося верного введенного email – нет. Напишем для этого свой класс-атрибут, проверяющий корректность введенного email: [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] public class ValidEmailAttribute: ValidationAttribute { public override bool IsValid(object value) { if (value == null) { return true; } if (! (value is string)) { return true; } var source = value as string; if (string.IsNullOrWhiteSpace(source)) { return true; }
var regex = new Regex(@" \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", RegexOptions.Compiled); var match = regex.Match(source); return (match.Success & & match.Length == source.Length); } } Вначале проверяем, что полученный объект есть строка, и строка не пустая, иначе возвращаем значение «истина» в проверке. Тут срабатывает правило, что «мы у инопланетян документы не проверяем», т.е. пока нет достаточных условий для проверки – мы не проверяем, а проверять будут другие атрибуты. Потом же, с помощью регулярного выражения, проверяем. При желании, в интернете можно найти более полную проверку регулярным выражением с использованием всех доменов первого уровня. Примечание: Можно подключить DataAnnotationsExtensions, чтобы не писать самому нужные атрибуты (https://dataannotationsextensions.org/) Добавим пользователю поле дня рождения. Да, прямо сейчас, и посмотрим, как можно реализовать выбор даты. 1. Добавляем поле в БД. Birthdate datetime null. Примечание: возможно, надо будет снять эту галочку, чтобы спокойно изменять структуру БД: 2. В данных выставим всем записям значения 2012-1-1 3. Изменим поле Birthdate на datetime not null 4. Удаляем из LessonProjectDb.dbml таблицу User и заново переносим из Server Explorer 5. В SqlRepository/User.cs добавляем строку в UpdateUser(): public bool UpdateUser(User instance) { User cache = Db.Users.Where(p => p.ID == instance.ID).FirstOrDefault(); if (cache! = null) { cache.Birthdate = instance.Birthdate; cache.AvatarPath = instance.AvatarPath; cache.Email = instance.Email; Db.Users.Context.SubmitChanges(); return true; } return false; } 6. В UserView у нас будет совершенно другое представление о поле Bithdate. И об этом чуть подробнее отдельно.
Выбор дня рождения у нас будет таким:
Тут надо решить несколько задач. Первая из них – создание и организация выпадающего списока. В Html (который мы еще позже рассмотрим подробнее) есть DropDownList, который реализует выпадающий список. Параметры такие: @Html.DropDownList(string name, IEnumerable< SelectListItem> selectList) Смотрим SelectListItem: public class SelectListItem { public SelectListItem();
public bool Selected { get; set; } public string Text { get; set; } public string Value { get; set; } } Для выбора, например, из 1 - apple, 2 – orange (выбран), 3 - banana мы должны написать следующий код: public IEnumerable< SelectListItem> SelectFruit { get { yield return new SelectListItem() { Value = " 1", Text = " apple", Selected = false }; yield return new SelectListItem() { Value = " 2", Text = " orange", Selected = true }; yield return new SelectListItem() { Value = " 3", Text = " banana", Selected = false }; } } И передать в DropDownList() вторым параметром, первый параметр – name, которому присвоится значение Value при подтверждении (сабмите) формы. создадим реализацию для выбора дня рождения: public int BirthdateDay { get; set; }
public int BirthdateMonth { get; set; }
public int BirthdateYear { get; set; }
public IEnumerable< SelectListItem> BirthdateDaySelectList { get { for (int i = 1; i < 32; i++) { yield return new SelectListItem { Value = i.ToString(), Text = i.ToString(), Selected = BirthdateDay == i }; } } }
public IEnumerable< SelectListItem> BirthdateMonthSelectList { get { for (int i = 1; i < 13; i++) { yield return new SelectListItem { Value = i.ToString(), Text = new DateTime(2000, i, 1).ToString(" MMMM"), Selected = BirthdateMonth == i }; } } }
public IEnumerable< SelectListItem> BirthdateYearSelectList { get { for (int i = 1910; i < DateTime.Now.Year; i++) { yield return new SelectListItem { Value = i.ToString(), Text = i.ToString(), Selected = BirthdateYear == i }; } } } И во View: < div class=" control-group" > < label class=" control-label" for=" FirstName" > Birth date < /label> < div class=" controls" > @Html.DropDownList(" BirthdateDay", Model.BirthdateDaySelectList) @Html.DropDownList(" BirthdateMonth", Model.BirthdateMonthSelectList) @Html.DropDownList(" BirthdateYear", Model.BirthdateYearSelectList) < /div> < /div> Запустим приложение и поставим брейк-поинт point на приеме данных. Проверим, как мы получаем данные для полей даты рождения для объекта UserView: Теперь осталось правильно передать их в объект User. Опишем эту передачу в описании маппинга: Mapper.CreateMap< User, UserView> () .ForMember(dest => dest.BirthdateDay, opt => opt.MapFrom(src => src.Birthdate.Day)) .ForMember(dest => dest.BirthdateMonth, opt => opt.MapFrom(src => src.Birthdate.Month)) .ForMember(dest => dest.BirthdateYear, opt => opt.MapFrom(src => src.Birthdate.Year)); Mapper.CreateMap< UserView, User> () .ForMember(dest => dest.Birthdate, opt => opt.MapFrom(src => new DateTime(src.BirthdateYear, src.BirthdateMonth, src.BirthdateDay)));
Здесь мы задаем правила однозначного перевода из свойств BirthdateDay, BirthdateMonth, BirthdateYear в Birthdate и обратно.
|