Loading...
VenelinGrozev avatar VenelinGrozev 130 Точки

[Homework} Binding models

Здравейте,

Докато решавам днес задачите от домашното изникна следният въпрос - трябва ли binding моделите да бъдат направени отделно от моделите, които ползваме в EF проекта?

В конкретният случай имам solution в който имам следните проекти

BookShopSystem.Models

--Author.cs

 

--Book.cs

...

BookShopWebApplication

--Models

----IdentityModels.cs

...

За binding модел ползвам моделите от BookShopSystem.Models. Трябва ли да ги създам и папката Models на BookShopWebApplication проекта?

Тагове:
0
Advanced Level: Back-End 16/08/2015 15:20:37
vladislav.karamfilov avatar vladislav.karamfilov 1123 Точки

По-добре си отдели един проект за binding моделите (те в своята същност са DTO-та). В твоя случай може да добавиш един проект BookShopSystem.Dto. 

Също така, ако си в авантюристично настроение, можеш да разгледаш библиотеката AutoMapper, която може да използваш за създаване на обекти от моделите за базата данни към DTO и обратно. :)

2
a_rusenov avatar a_rusenov 1103 Точки

Добре е да имаш отделни класове за binding модели. Например истинският ти модел за пост е:

public class Post
{
  [Key]
  public int Id { get; set; }

  [Required]
  public User Author { get; set; }

  public DateTime PostedOn { get; set; }
  
  [Required]
  public string Content { get; set; }
}

Обаче за да добавиш пост подаваш само Content. Ако ползваш оригиналния модел, при проверката if (this.ModelState.IsValid) няма да мине, понеже Author не е бил подаден в заявката (а е Required). Също така DateTime PostedOn не би трябвало да се подава, той се взима server-side.

Затова в Services проекта в Models правим АddPostBindingModel клас само с нещата, които получава в заявката:

public class AddPostBindingModel
{
  [Required]
  public string Content { get; set; }
}
3
16/08/2015 20:02:36
VenelinGrozev avatar VenelinGrozev 130 Точки

Ок, благодаря и на двама ви. Най-интересното е, че валидацията с оригиналния EF модел минава без грешки, въпреки че липсва id. Имам предвид конкретно при класа на автора

public class Author
    {
        private ICollection<Book> books;

        public Author()
        {
            this.books = new HashSet<Book>();
        }

        [Key]
        public int Id { get; set; }

        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        public virtual ICollection<Book> Books
        {
            get { return this.books; }
            set { this.books = value; }
        }
    }

 

0
a_rusenov avatar a_rusenov 1103 Точки

Прав си, когато не се подаде изрично, id-то просто дефолтва (int до 0 или string до null). Поправих си примера.

Попринцип правилото е binding моделът да пази само данните, които получаваме от заявката. Отделно решава следните проблеми:

  • Данните от заявката не се мапват до пропъртито (например праща се text вместо content - в такъв случай правим binding model с пропърти Text)
  • Някои неща от оригиналния модел са задължителни, но не ги получаваме от заявката (например авторът при добавяне на пост - него го взимаме чрез access_token от хедърите, не от body-то)
  • Трябват ни допълнителни валидации, но не искаме да пипаме по DB моделите
1
16/08/2015 20:03:24
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.