C@@@@@+++____

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>

Report Page