Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Атрибуты. Для 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 и обратно.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.