C@@@@@+++____
Ну а хули размышлять1. Создание проекта
2. Добавление identity
3. В /Data/ApplicationDbContext.cs находиться класс ApplicationDbContext через который мы и конектимся к базе данных
4. В той же папке дата есть папка миграции где находиться файл с много нулями где находиться код который создает всякие таблицы где хранит данные которые ему надо при регистре и логине, кукис и тд
5. Нужно в этой папке создать новый класс BlogItem.cs
6.
using System.ComponentModel.DataAnnotations; Это как раз для атрибута Key
namespace NameOfProject.Data
public record(тут мы удаляем класс и заменяем его на рекорд, говорят так мол лучше для работы с бд сам не ебу все равно при компиляции он будет классом) BlogItem
{
тут мы как раз напишем инфу которую мы хотим получить от юзера или ту которую мы хотим что бы работала с бд
мол что бы соедениться с базой данных нужно добавить атрибут
[Key]
public int Id{get;set;}
[Required, MaxLength(140)] Так как название статьи обьязательно то нам нужен атрибут который в бд чекнеть если в этот титл есть значение
public string Title{get;set;}
[Required] дата тож обьяз
public DateTime Datum{get;set;} = DateTime.Now;
[MaxLength(255)]
public string Perex{get;set;}
[DataType(DataType.MultilineText), Display(Name = "Высер: ")] data это данные type это тип, все понятно
Атрибут дисплай отображает Высер вместо Article
public string Article{get;set;}
}
7. И так заходим в файл ApplicationDbContext и добавляем туда наш класс походу
public DbSet<Название класса а точнее BlogItem>
Свойство DbSet представляет собой коллекцию объектов, которая сопоставляется с определенной таблицей в базе данных. То есть свойство Users будет представлять таблицу, в которой будут храниться объекты User.
public DbSet<BlogItem> Blog => Set<BlogItem>();
Че такое дбсет я уже сказал и в нашем случае оно представляет собой коллекцию обьектов(BlogItem) которые храняться в таблице Blog и создаеться она походу с помощью лямбды которая передает вот эти вот блогайтем в таблицу, честно не ебу
суть в том что в Blog находиться нужные нам статьи
крч как я пон он как бы его создаст этот сет(типа команда) и когда мы будем че то новое создавать он будет сам делать запросы на скюл и обратно
8.Тут вроде бы все
Нам щас надо настроить бд и мы заходим в консоль каких то там пакетов(консоль диспетчера пакетов)
заходим и пишем
Add-Migration Add_Blog адд блог это название вроде
9. Щас у вас в миграциях появился файлик где и есть те айди титл дату и тд что мы писали
заходим еще раз в консоль и пишем
Update-Database
10. Создаем пустую Razor страницу в Pages название BlogList
заходим и пишем
<a href="editor/blog/0">Save</a>
а за @page добавляем "/blog"
11. Создаем новую папку в папке Areas название Editor в этой папке создадим папку Pages
12. Копируем все файлики с Identity/Pages/Account и в файлике _ViewImports удаляем первую строку и вместо Identity пишем Editor
13. В нашу папочку добавляеем разор пустую страницу BlogItemEditor
14. Добавляем url "/editor/blog/{ItemId:int}" и заходим в ту же страницу только в файл cshtml.cs и добавляешь этот самый ItemId: public int ItemId{get;set;} с атрибутом [BindProperty(SupportsGet=true)] вот тут статья как работает бинты https://metanit.com/sharp/aspnet5/29.4.php
15. Далее ебашим вот этот код
readonly ApplicationDbContext = DB;
public BlogItemEditModel(ApplicationDbContext db)
{
DB=db;
}
16. Нам нужен Input
[BindProperty]
public BlogItem Input{get;set;}
17. Изменяем онгет на асинк он гет(асинхронность дохуя)
public async Task OnGetAsync()
{
if(ItemId == 0)
Input = new BlogItem(); Создаем новую статью если айди ровняеться нулю
else
Input = await DB.Blog.FindAsync(ItemId) если же не ноль то находим статью по ключу в базе данных и добавляем в инпут
}
18. И так нам НАДО сделать метод онпост, говорит мол что онгет это для того что бы он нашел вот эту вот статью а онпост что бы че то там пожмякать
public async Task OnPostAsync()
{
if(Input == null || !TryValidateModel(Input)) Проверка на ошибочки
return;
if(ItemId == 0)
await DB.AddAsync(Input) Опять же если ноль то добавляем в базу данных новую статью Input
else if (ItemId > 0) Если айтемайди больше чем ноль то мы её можем редактировать
DB.Update(Input);
else if(Input.Id < 0) Если инпутайди меньше нуля то мы удаляем статью
{
Input.Id = ItemId;
DB.Remove(Input);
}
await DB.SaveChangesAsync(); Сохраняем изменения
Response.Redirect(/blog); Возвращаемся на страницу со всеми блогами
18. Добавляем на страницу .cshtml форму для создания или корректирования статьи
<h1>@(Model.ItemId == 0 ? "Новая статья" : "Изменить статью")</h1>
<form method="post">
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Input.Id" id="BlogId"/>
<div class="form-floating mb-3">
<input asp-for="Input.Nadpis" class="form-control" aria-required="true" placeholder="Название" />
<label asp-for="Input.Nadpis"></label>
<span asp-validation-for="Input.Nadpis" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Datum" class="form-control" aria-required="true" placeholder="Дата" />
<label asp-for="Input.Datum"></label>
<span asp-validation-for="Input.Datum" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Perex" class="form-control" placeholder="Описание" />
<label asp-for="Input.Perex"></label>
<span asp-validation-for="Input.Perex" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<textarea asp-for="Input.Article" class="form-control" style="height:20rem" placeholder="Текст"></textarea>
<label asp-for="Input.Article"></label>
<span asp-validation-for="Input.Article" class="text-danger"></span>
</div>
<div>
<button type="submit" class="coll btn-dark">Save</button>
<button type="submit" class="coll btn-danger" onclick="$('#BlogId').val(-1)">Delete</button>
<a href="/blog" type="submit"="" class="btn-warning">Back</a>
</div>
</form>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
18. эх идите вы нахуй, заходите в BlogList.cshtml.cs
<h1>@(Model.ItemId == 0 ? "Nova polozka blogu" : "Uprava polozky blogu")</h1>
<form method="post">
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Input.Id" id="BlogId"/>
<div class="form-floating mb-3">
<input asp-for="Input.Nadpis" class="form-control" aria-required="true" placeholder="Nadpis" />
<label asp-for="Input.Nadpis"></label>
<span asp-validation-for="Input.Nadpis" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Datum" class="form-control" aria-required="true" placeholder="Datum" />
<label asp-for="Input.Datum"></label>
<span asp-validation-for="Input.Datum" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Perex" class="form-control" placeholder="Perex" />
<label asp-for="Input.Perex"></label>
<span asp-validation-for="Input.Perex" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<textarea asp-for="Input.Article" class="form-control" style="height:20rem" placeholder="Article"></textarea>
<label asp-for="Input.Article"></label>
<span asp-validation-for="Input.Article" class="text-danger"></span>
</div>
<div>
<button type="submit" class="coll btn-dark">Save</button>
<button type="submit" class="coll btn-danger" onclick="$('#BlogId').val(-1)">Delete</button>
<a href="/blog" type="submit"="" class="btn-warning">Back</a>
</div>
</form>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
2354353434656745687. Заходим в файл BlogList.cshtml.cs и подключаем его к бд
readonly ApplicationDbContext = DB;
public List<BlogItem> BlogItems{get;set;} Создаем список статей
public BlogListModel(ApplicationDbContext db)
{
DB = db;
}
public async Task OnGetAsync()
{
BlogItems = await DB.Blog.OrderByDescending(x => x.Datum).ToListAsync(); Как я понял мы записываем все статьи в блогайтемс и новые статьи будут первые с помощью OrderByDescending
}
И в саму папку .cshtml пишем форму как оно будет отображаться
<div class="list-group">
@foreach (var item in Model.BlogItems)
{
<a href="/blog/@item.Id" class="list-group-item list-grou-item-action">
<h2>@item.Nadpis</h2>
<p>@item.Datum.ToString("dd.MM.yyyy")</p>
<p>@item.Perex</p>
</a>
}
</div>
563456457. Создаем новую страницу в Pages с названием BlogItem в которой и будет отображаться статья
@page "/blog/{ItemId:int}"
Закрываем к ху.м и заходим в тот же файл толькo .cshtml.cs
readonly ApplicationDbContext = DB;
[BindProperty(SupportsGet = true)]
public int ItemId{get;set;};
public BlogItem Blog{get;set;};
public BlogItemModel(ApplicationDbContext db)
{
DB = db;
}
public async Task OnGetAsync()
{
Blog = await DB.Blog.FindAsync(ItemId);
}
345657567. Заходим в .сshtml
@if (Model.Blog == null)
{
<p>PoshelnachuйПроверОчка происходит</p>
return;
}
<h1>@Model.Blog.Nadpis</h1>
<p class="btn-dark">@Model.Blog.Datum.ToString("dd.MM.yyyy")</p>
<p class="btn-dark">@Model.Blog.Article</p>
<p>
<a href="/blog" class="btn btn-dark w-25 float-start">Back</a>
<a href="/editor/blog/@Model.Blog.Id" class="btn btn-dark float-end">Edit</a>
</p>