Изучение ASP.NET Core MVC / #3 - Создание моделей и интерфейсов в ASP.NET
HTML-код
- Опубликовано: 3 окт 2024
- Модели содержат набор полей, позволяющих работать с данными и создавать различные объекты через ASP.NET Core. В уроке вы создадите модель, интрефейс, вмещающий функции по работе с моделью, а также добавите объекты, содержащие информацию про товары и категории на сайте.
1) Урок на сайте itProger: itproger.com/c...
✔ Сообщество программистов: itproger.com/
✔ -------------
Вступай в группу Вк - prog_life 🚀
Группа FaceBook - goo.gl/XW0aaP
Инстаграм itProger: / itproger_official
Instagram: / gosha_dudar
Telegram: t.me/itProger_o...
Twitter - / goshadudar
Уроки от #GoshaDudar 👨🏼💻
Все уроки по хештегу #goshaASP
Спасибо за твою работу, для меня твои уроки оказались полезными. Дальнейших тебе успехов.
Большое спасибо за ваши ролики!
Конечно, многие замечания в комментариях не безосновательны, но количество полезной информации в сотни раз превалирует над различного рода неточностями. Для начинающих (в том числе и для меня) эта информация действительно ценна
С меня однозначно лайк и уважение)
Первый раз вижу такой подход, когда интерфейс реализуется через свойства. Я к тому, что по моему мнению каждой из представленных свойст лучше вынести в функцию
Свойства принято называть с заглавной буквы, а тип переменной к цене товара принято применять decimal
@bitmap Я очень тупой, так что просветите
@bitmap Хорошо, спасибо.
Почему вы автоматические свойства называете полями? и вам IDE подсвечивает что они должны быть с большой буквы....
потому что жава стайл
Угараешь он свойства называет функцией, он сломал c#
Челик вам рассказал столько всего, прям для детей разложил, а вы на таких мелочах застыли, это прям грустно :/
@@eqweqrsfyt3w47yr8 он ввел всех в заблуждение из за чего потом людей на интервю пинать будут о чем ты ?
@@davidkroods811 дурак тот кто готовится к интервью по одному видео)))
Георгий, спасибо Вам за данный курс и за Ваш труд!!! Очень жду части с сессиями и кукис!!!
Не понимаю зачем сюда заходить, смотреть урок (причем 3) а потом выливать негативные комменты. Критикуешь - предлагай, сделай лучше. По крайней мере по занятиям можно учиться, автор не раздражает и заумь не толкает. За что ему спасибо. Ведь это бесплатные уроки, кто кому чем обязан?
Новички, всё запомнили? Вот так делать не надо. И термины повторите из авторитетного источника (Свойство от метода). 'Car' (как и все сущности) это набор свойств, ни о каких списках он не должен знать, а есть 'Cars : List' вот здесь, и фильтры, и поиск по имени и ID. Жизнь будет проще. Каждый класс должен 1 делом заниматься, очень редко двумя(но потом придется переписывать, если будет развиваться).
Честно говоря я практически никогда не токсичен, но учиться по этому говну реально опасно. Новички, лучше бегите
Как же много чсв прогеров в коммах, которые преисполнились в познании и теперь доебываются до каждой мелочи. "Не функция, а метод!!!!. Свойства с маленькой буквы?!?!?". Людям, которые это смотрят, эти нюансы не так важны и соблюдение терминологии и кодстайла никак на знания не повлияет. Основная цель - понять суть. Спасибо Гоше за видосы.
Извини меня. Не отличать свойство класса от функции это перебор. Это показывает, что человек не знает основ языка. Скажи такое на собеседовании - выкинут к чертям учить матчасть
Спасибо, очень полезный курс!
Классный и плодотворный урок. Все на пальцах понятно. Очень жду продолжения)
По-поводу Category =_CategoryCars.AllCategories.First() и Last(). 24:36 Мы сейчас указываем на первую позицию First() в списке категорий или последнюю Last() списка List. А если например в списке категорий будут не только две позиции электро авто и классические, а три или больше. Как указать например на категории между первой и последней?
Я бы рекомендовал вообще изучить технологию LINQ. Многие вопросы отвалятся и жизнь будет проще ;)
у меня такаЯ же жопа но решить ее я пока не смог
you can use ElementAt:
Category = _categoryCar.AllCategories.ElementAt(currentIndex)
@@debasher А сказать, что можно использовать elementat(int) никак религия не позволяет, ага?
@@ДмитрийИванов-ч3ж можно даже через индекс, однако в практике используется выборка с какими то условиями, поэтому ориентироваться на индексы бесполезно
12:53 это не подключение папки, а пространства имен
Readonly - значит, что переменная как const, но в нее можно записать значение во время создания объекта.
спасибо кэп
Благодарен!
Крутой опыт по факту спасибо за урок.
1. Почему свойства классов пишутся с маленькой буквы?
2. Почему сперва написан set, а не get?
3. Зачем сокращать название переменной desc, если можно написать Description?
18:13 данная функция бблть)) пхахххаххх
Бро , это больше урок про ООП на решетке , чем про ASP.NET Core :)
А как по-другому?
Прекрасно, просто молодец
Спасибо за урок, Гоша!
Спасибо за видео!
super !! Ogromnaja Blagodarnost' :)
ЭТО НЕ ФУНКЦИЯ, ЭТО СВОЙСТВО!!!!!!
свойство с ручной реализацией
Спасибо большое за такой полезный видос. Ты сократил моё время на поиски и прочтение книг, статей. Но хотелось бы знать как и откуда взялись ссылки на картинки.
Гоша, молодец!
Не обращай внимания на негативные отзывы: очень много среди твоих зрителей комментаторов-наци: код-наци, граммар-наци. Непонятно, правда, зачем они смотрят обучающие видео, если уже обладают сверхразумом, сверхзнаниями и сверхопытом, а "Hello, world!" научились писать на всех языках ещё задолго до зачатия.
От себя могу сказать, что, конечно, есть минусы, но они несущественны, потому что ты объясняешь именно для новичков: очень доступно и популярно. А человек (разумный), который заинтересовался темой после просмотра твоих уроков, займётся практикой и уже на практике сможет понять где были недочеты. И надо быть достаточно близким (в смысле не очень далёким), чтобы при обвинении в нечистоте кода настаивать, что правильно именно так, потому что Гоша Дударь так сказал в обучающем видео, а больше никакого обучения не надо! Нужно думать своей головой и изучать как правильно - самостоятельно!
Ты отлично выполняешь задачу для новичков - заинтересовываешь!
P.S. Ещё очень хочется отметить рост английского произношения - очень ощутимо - молодец!
Автор сделал какую-то херню и льет это в голову новичкам. Это непростительно. Да и видно что человек не владеет вопросом. Непростительно вдвойне.
Я не могу об больше об этом молчать. 8:11 мне кажется, это чуть ли не идеальный случай для использования наследования: если мы создадим несколько классов на основе Category, то сможем мало того что добавлять или переопределять методы род класса, так еще избавимся от айди. такой подход будет более удачный на случай добавления специфической логики для каждой из категории(а этот случай рано или поздно настанет). А при записывании свойства в Сar просто даун кастить(приводить производный тип к базовому). ну и практически то же самое на 26:08 только уже с классом Сar.
Я один не понял, зачем вообще нужны были здесь интерфейсы? Можно же было тупо исп. LINQ, никакой специфики не увидел.
Когда дошло до данных просто убил наповал... Почему не было создано фиктивное хранилище? Зачем эти издевательства...
Думал стоит или нет, понял что таки стоит. Выложу класс имитации хранилища(Много букв сорри). Названия свойств сущностей могут отличаться(!). Без всяких интерфейсов.
P.S. После таких видео думаю вернуться к книгам...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Shop.Models
{
public class ImitationDB
{
public ImitationDB()
{
Categories = new List();
Categories.Add(new Category() { Id = 1, Name = "Электромобили", Description = "Современный вид транспорта" });
Categories.Add(new Category() { Id = 2, Name = "Классические автомобили", Description = "Машины с двигателем внутреннего сгорания" });
Cars = new List();
Cars.Add(new Car()
{
Id = 1,
Name = "Tesla Model 5",
ShortDescription = "Быстрый автомобиль",
WholeDescription = "Красивый, быстрый и очень тихий автомобиль компании Tesla",
Image = "www.tesla.com/content/dam/tesla-site/sx-redesign/img/socialcard/MS.jpg",
Price = 45000,
IsFavourite = true,
Available = true,
Category = Categories.First(f => f.Name == "Электромобили") });
Cars.Add(new Car()
{
Id = 2,
Name = "Ford Fiesta",
ShortDescription = "Тихий и спокойный",
WholeDescription = "Удобный автомобиль для городской жизни",
Image = "www.winnerauto.ua/uploads/gallery_photo/photo/0170/91.jpg",
Price = 11000,
IsFavourite = false,
Available = true,
Category = Categories.First(f => f.Name == "Классические автомобили")
});
Cars.Add(new Car()
{
Id = 3,
Name = "BMW M3",
ShortDescription = "Дерзкий и стильный",
WholeDescription = "Удобный автомобиль для городской жизни",
Image = "img.tipcars.com/fotky_velke/33550669_9/2018/E/bmw-m3-top-m-performance-paket.jpg",
Price = 65000,
IsFavourite = true,
Available = true,
Category = Categories.First(f => f.Name == "Классические автомобили")
});
Cars.Add(new Car()
{
Id = 4,
Name = "Mercedes C class",
ShortDescription = "Уютный и большой",
WholeDescription = "Удобный автомобиль для городской жизни",
Image = "img.tipcars.com/fotky_velke/33550669_9/2018/E/bmw-m3-top-m-performance-paket.jpg",
Price = 40000,
IsFavourite = false,
Available = false,
Category = Categories.First(f => f.Name == "Классические автомобили")
});
Cars.Add(new Car()
{
Id = 5,
Name = "Nissan Leaf",
ShortDescription = "Бесшумный и экономный",
WholeDescription = "Удобный автомобиль для городской жизни",
Image = "d2t6ms4cjod3h9.cloudfront.net/wp-content/uploads/2018/11/LEAF_Nissan_Energy_Share-source.jpg",
Price = 14000,
IsFavourite = true,
Available = true,
Category = Categories.First(f => f.Name == "Электромобили")
});
}
public List Cars { get; }
public List Categories { get; }
}
}
Что за книга ?
@@Hunter314414 при чем тут паттерн mvc к классу???
К стати очень полезно! Это делается для того что бы разделить разработку на части! Если делать сразу то пока ты все соберешь много времени пройдет и можно такого налепить, то потом задерешься исправлять. Ну а применение интерфейсов вообще это святое. Потом под интерфейс подставляешь другую реализацию и погнали. А если писать класс как написал ты, то ты будешь его где-то указывать уже в живом коде и при переходе весь код придется ковырять так как вряд ли названия класса реализующего доступ к бд будет зваться ImitationDB, а название интерфейса останется то же самое. Короче в нормальных проектах без интерфейсов никак.
@@sergbo3114 ну это сделано для тестов, если нужен полиморфизм, то да через интерфейс сделать удобней всего, но опять таки, даже через интерфейс всё равно удобнее сделать фиктивное хранилище, чем то спагетти в видео.
Какое ещё спагетти? Конкретно 2 вещи: интерфейс и реализация. Спагетти это если бы методы вызывали бы методы другого класса без функциональной обоснованности. А в интерфейсе нет кода метода есть только объявление.
Гоша, не будучи программистом, даже я знаю, что названия пропертей, в соответствии с КодКонвеншен, пишутся с большой буквы, о чем Вам, собственно, подсказывает Студия:)) Во-вторых, только тсссс, никому, в Коре навигационные свойства не требуют virtual:))) Почитайте документацию для новой EF, написанной для Кора:))) Ну и в-третьих, пишите проект на ТРЕХСЛОЙКЕ!!!!!
Даже в обычной asp mvc не надо писать virtual, так что коре не причем....
@@xopekyt8224 Надо! Изучите документацию по EF6, LazyLoading, в частности!
Он использует "КодКонвеншен" Mono. Об этом еще говорит расположение фигурных скобок
www.mono-project.com/community/contributing/coding-guidelines/
он тоже не программист на ASP
Почему available int, а не ushort? Ведь по сути так же не может быть отрицательного значения, и врятли на складе есть в наличии больше 1000 автомобилей.
Знающие люди, объясните пожалуйста, чем является mock? Для в общем случае создается mock?
22:00 В этом коде так же изменения, записывайте как
public IEnumerable Cars => new List
{
new Car { name = "Тесла", shortDesc = "", longDesc = "", img = "", price = 46000, isFavourite = true, availabel = true }
};
public IEnumerable getFavCars { get; set; }
почему Categories не сделать Enum?
Кто знает зачем эти Моки нужны? Зачем реализововать интерфейсы в другом классе?
Почему функции возвращают IEnumerable, а не List, зачем усложнять?
Свойства пишутся с большой буквы как бэ
Так это не обязательно
Братан, не трогай .NET, только хуже сделаешь для тех, кто только начинает учить C#
А что мне потрогать как новичку в .NET?
@@t.on.y WinForms, WPF, все с этого начинают. Есть ещё Console, но там это всё тоже самое, только без GUI
@@t.on.y книги
Здравствуйте) а если больше двух категорий) как быть?)
сделать несколько категорий
@@IlyaZherebtsov как ссылаться на 2 категорию из 3?
Category=_CategoryCars.AllCategories.ElementAtOrDefault(/*Тут индекс*/);
Не ужели так сложно с EF сделать, мокс никто не использует.
кто еще не успел сказать, что это метод а не функция)?
а есть разница?
OVERENSAL нет. Но в ооп принято называть это методами, они принадлежат классам
@@nikolaydudin5293 Функции в ООП - это методы, свойства, конструкторы, финализаторы, операции и индексаторы.
Курс полезный для новичков, но в большинстве случаев .Net разрабы используют тип int всегда
это кто такое вам сказал?
Материал отличный, но столько раз одна мысль подряд повторяется, что бесит, приходится слушать на скорости 1,5. Видео можно урезать в 2 раза без потери качества объяснения.
Если с бд это EF поле CategoryID можно не указывать он сам еёго генерит..при построении связей
Машины с двигателями внутреннего Згорания
Нельзя, чтоб сущности ссылались друг на друга. Это не нормально. У машины есть ссылка на категорию. Этого достаточно, у категории не должно быть списка машин.
На первой минуте думал что мне звонят
19:26 згорания
Новичкам советую всё что в этом уроке сказано - принять к сведению и забыть. Так код писать нельзя. Весь урок про АСП ни слова. Можно было БД сымитировать. Просто лютая дичь. Форматирование и наименование вырвиглазное. Такое ощущение складывается, что автор сам учится на АСП и шарпе пока снимает это видео.
а кого рекомендуете смотреть?
Я почему то предпочитаю модели для отображения держать отдельно от моделей данных...
Вижла на русском... Просто кровь из глаз! Ну и форматирование кода конечно тоже не стандартное
везде принято писать {get; set;}
а здесь наоборот. тяжело воспринимать.
Самое интересное, что заходишь на видео по урокам ASP.NET с нуля,а в комментариях уже профессоры по тому как и что должно называться..) Какая разница? Главное практика, понимания процесса и результат.
С такими уроками вас ждет ху*вый результат. Лучше почитать книгу
@@remingtontuflips2797 какую книгу можешь посоветовать?
конечно с SQL все будет намного красивее выглядеть
а почему вместо класса VS предлагает мне создать Информациионный файл сборки
подскажите, нашли решение?
Что значит mock?
Там до интерфейсов все норм(
Все свойства должны писаться с большой буквы! Такая неграмотность , после того как учился по метаниту тяжко тут
Почему у меня даёт ошибка IAllCategories в классе mockCategory.cs?
проверьте, если ваша ошибка связана с тем, что вы пишете что-то в кавычках и получаете ошибку, значит вы использовали не string, a int
Спасибо за урок, а админка к сайту будет?
Нужна админка, изучай Django
ГОША сними как установить моно девелоп . Там по другому стала установка , а на русском нет !!!
Как бесит это словоблудие... "Категория в категории, для категории, потому что для категории в категории нужна категория. Мы это пиши потому что категории в категориях полезны, чтобы категорировать категории в категориях"... И так в каждом видео в каждом аспекте. Ты хоть сценарий состовляй, прежде чем видео записывать.
...но да, спасибо за видео уроки, если опустить этот огромный минус, всё остальное в жирном плюсе.
это бэкэнд или фронтэнд?
Бэкенд
Смотрю, смотрю. Именование... хрен с ним, терминология... хрен с ней и досмотрелся до 10 минуты. У нас есть Car, в который я могу указать id категории 1, ссылку на категорию с id 2 и не указывать этот Car в листах этих категорий... архитектура вахую. Смотрю что за автор, что-бы никогда больше его не включать и вспоминаю, как звезду одного из выпусков по говнокоду, Ромы Сакутина =D
Почему нельзя объявить вместо IEnumerable через простой лист?
Повышает гибкость кода. В качестве возвращаемого значения следует возвращать класс, который будет способен выполнить то, что требуется. Возможно возврат листа будет давать избыточную функциональность
@@gospodin_uretra Спасибо за ответ! :)
почти на java похож синтаксис
Интересно асп еще долго будет рентабельным?
вэчно ! )))
. Net скоро пхп вытеснит:(
@@seka1309 скорее б
)) mocks code
Всем привет! Хочу создать небольшую группу людей, которые как и я пробуют себя в вебе на C#. Думаю так учиться будет проще и интереснее.
Если тоже ищешь единомышленников, то отпишись.
Как успехи? Я чет думаю делать веб приложения, но пока не нашёл курс для такого новачка как я
Ты еще учишься? Отпиши
@@BrostylesCat Да, пришлось это дело приостановить и делать WPF приложение. Щас опать ASP начал. Делаю совместный курсовой проект.
CSharpWebSquad в телеге
Не Згорания, а Сгорания.
АААА, у меня кровь из глаз
Сгорание с не згорание, ну ё моё, ты в каком слове видел приставку "з"?
Если у меня несколько категорий например 6, Как мне выбрать вторую или третью...?? Я например пишу Second а оно не видит...Что делать?
Изучите Linq. вместо .first() писать .Where(e=> e.cathergoryName =="электромобиль")
@@dmytroku855 Зачем вы преобразовываете селектом e в логический тип. Select не работает так
@@yankozyrenko9348 Вместо "Select" там "Where" должно быть. Исправил, спасибо за замечание.
Я бы с радостью занимался программированием, но к сожалению у меня MacBook 13 - дюймовый да ещё и без тачбара. На таком работать очень неудобно, поэтому я не заниматься 😔. Почему у меня такие невыносимые условия работы((
Очень удобный ноут для работы. Ставь Bootcamp и вперед.
Alexey Malyuk та зачем буткемп, через parallels desktop виртуальная машина 🚗🚘
@@ЮрійЛебідь-в2п ну это уже кто как любит, дело вкуса :) Но 13 макбук, очень норм для разработки.
Alexey Malyuk я до этого на курсах работал на Imac 5K на 27 дюймов, и это небо и земля. Столько свободного рабочего места, после такого здорового экрана переходить на 13 неудобно)) Очень хочется экран докупить, но денег нема((
Yurii Lebid Ну я сам разработчик уже 4 года, как раз работаю на ASP.NET, то изначально работал на два монитора: 16:9 + 4:3, потом два 16:9, сейчас только ноутбук 15.6" и монитор даже тошнит подключать, всего хватает, да и глаза меньше устают. 🙂
В интерфейсе, кроме одного элемента, ты объявлял свойства, а не функции.
Технически свойство - эта функция, а точнее максимум 2. Первая get(), вторая set(param). Только тут автор юзает автосвойство в таком случае поле создается автоматически и при этом имеет практически рандомное название (но это не точно).
@@vladbaryshevskiy4394 у автосвойства поле вроде называется также как и само свойство, только с маленькой буквы
Ставишь на 1.75. И урок залетает только в путь. Спасибо!
то чувство когда немного шаришь c++, но это все равно интересно смотреть)
ЭТО ПЛАГИАТ !!!!!!!!!!!!!!
Код полностью украденный у другого человека !!!
Гоша, и тебе не стыдно? Ты не просто украл какой-то код с гитхаба и его объяснил, ты украл у человека, который снял видео по своему коду! Позор тебе !!!
сурс можно?
можно ссылку на ресурс
Пишу по поводу что IHostingEnvironment устарела и майкрософты рекомендуют как замену Microsoft.AspNetCore.Hosting.IWebHostEnvironment.
Либо указывайте так using IHostingEnvironment = Microsoft.Extensions.Hosting.IHostingEnvironment;
НО НЕ РЕКОМЕНДУЮ
Прежде чем делать такого рода видеоролики, стоит изучить для начала гайдлайн и базовые вещи C#, я уже молчу про автосвойства, названия с маленькой буквы, визуальное выделение приватных полей, твое понимание почему принято писать I перед названием интерфейса, оптимизацию и производительность. Это лишь малая часть замечаний, ладно опустим это, но даже не знать что такое навигационное свойство... Эт не серьезно...