# ASP.NET Core #1
## HTTP
Mechanizm pozwalający na wymianę danych pomiędzy komputerami - za pomocą sieci. Jest **bezstanowy**, czy nie posiada pamięci (czyli nie pamięta wcześniejszych zapytań, trzeba "przypominać" o niektórych rzeczach)
* **serwer** - świadczy usługi innym programom (klientom)
* **klient** - program, który korzysta z usług serwera
W dużym uproszczeniu, komunikacja polega na wysyłaniu wzajemnych komunikatów pomiędzy klientem i serwerem. Serwer i klient (klienci) komunikują się według schematu zapytanie-odpowiedź tzn. klient inicjuje komunikację, a serwer odpowiada na zapytania wysyłane przez klienta.
HTTPS - HTTP + Secure, dodaje dodatkowe szyfrowanie
## MVC - Model View Controller
Wzorzec architektoniczny służący do organizowania struktury aplikacji posiadającej graficzne interfejsy użytkownika (wiki)
* **Model** - jest to opis czegoś (student, samochód), zbiór danych coś opisujących. Często pokrywa się ze strukturą bazy danych.
* **Controller** - przyjmuje zapytania od klienta, wykonuje operacje na modelu (zmienia dane, dodaje nowe, usuwa itd), zmienia widok
* **View** - część odpowiedzialna za wyświetlenie informacji dla użytkownika. Mogą zmieniać stan modelu, ale tylko wizualnie (np. wyświetlić datę w innym formacie)
## Routing
Klient może wysyłać dużą liczbę żądań do serwera, tak samo serwer może mieć dużą liczbę kontrolerów i modeli.
Aby poprawnie zinterpretować zapytanie przesłane do serwera, wykorzystywany jest routing. Polega na pobraniu informacji z adresu URL i wyboru kontrolera i akcji na tej podstawie.
Domyślny schemat routingu w ASP.NET Core wygląda tak:
`{controller}/{action}/{id?}`
W przypadku nie podania nazwy akcji, domyślnie wybierana jest akcja Index, przy braku nazwy kontrolera domyslnie wybierany jest kontroler Home
**Przykłady:**
`localhost:5000/students/display` - Wybrana zostanie akcja Display z kontrolera Students
`localhost:5000/cars/manual/23` - Wybrana zostanie akcja Manual z kontrolera Cars, do której zostanie przekazany parametr o wartości 23
**Wielkość liter w adresie URL nie ma znaczenia**
## Struktura projektu ASP.NET Core MVC
* **Dependencies** - biblioteki używane w naszym projekcie
* **Properties** - zawiera plik launchSettings.json, w którym znajdują się informacje dotyczące konfiguracji lokalnego serwera
* **wwwroot** - folder z plikami statycznymi, które mogą być wysyłane do klienta (zdjęcia, ikony, style css, skrypty JavaScript)
* **Controllers** - folder, w którym znajdują się kontrolery. Konwencja wymusza aby każdy z nich posiadał sufiks -Controller np. StudentsController, VehiclesController itd.
* **Models** - folder, w którym znajdują się klasy modelu
* **Views** - folder z widokami. Każdy kontroler, który zwraca widoki posiada swój podfolder o nazwie odpowiadającej nazwie kontrolera np. Students, Vehicles
* **appsettings.json** - plik zawierający informacje nt. podstawowej konfiguracji aplikacji
* **Program.cs** - punkt wejścia do aplikacji, zawiera w sobie klasę Program, która uruchamia serwer
* **Startup.cs** - zawiera w sobie klasę Startup, która posiada 2 metody: `ConfigureServices` oraz `Configure`. Pierwsza z nich pozwala na poinformowanie o kodzie, który chcemy wykorzystywać w różnych miejscach naszej aplikacji. Druga z kolei konfiguruje **HTTP request pipeline** czyli sposób w jaki każde zapytanie HTTP jest "obrabiane" zanim trafi do odpowiedniego kontrolera (opowieść o ludziach stojących w rurociągu i grających w głuchy telefon). Oprogramowanie, które przetwarza zapytanie HTTP nazywane jest **middleware** (oprogramowanie pośredniczące).
## Kod
### internal
```c#embedded
class Student
{
}
```
Jak widać, ta klasa nie ma swojego operatora dostępu. Domyślnie jest to **internal**, czyli publicznie dostępne, ale tylko wewnątrz tego projektu.
### Przeciążenie metod (overload)
```c#embedded
public void Method() { /**/ }
public void Method(object model) { /**/ }
public void Method(string name, object model) { /**/ }
```
Przeciążenie metod to po prostu tworzenie metod o tej samej nazwie, ale o różnych parametrach (różna ilość, różne typy itd.)
### Kod c# w .cshtml
```
@kod
```
Wszystko co po @ jest traktowane jako C#
### Przesyłanie danych z kontrolera do widoku
```c#embedded
public class HomeController : Controller
{
public IActionResult Index()
{
var student = new Student ()
{
Id = 1,
Index = 123456,
FirstName = "Daniel",
LastName = "Wilkiewicz"
};
return View (student);
}
}
```
Do widoku o nazwie Index, zostanie przesłany obiekt `student` zawierający 4 właściwości.
### Odczytywanie w widoku danych przesłanych z kontrolera
```#htmlembedded
@model Student
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<p>Id: @Model.Id</p>
<p>Index: @Model.Index</p>
<p>First name: @Model.FirstName</p>
<p>Last name: @Model.LastName</p>
</div>
```
Widok otrzymał dane, ale aby móc je poprawnie zinterpretować potrzebne jest użycie słowa kluczowego `@Model`. W ten sposób informujemy widok o typie danych, z których korzystamy. Możemy teraz odwoływać się do przesłanego obiektu korzystając z właściwości `Model`. W powyższym przykładzie informujemy o tym, że przesłane dane są typu `Student`. Następnie możemy odwoływać się do nich w kodzie widoku, pamiętając o tym, żeby wyrażenie C# poprzedzać znakiem `@`
### Przesyłanie danych z widoku do kontrolera za pomocą parametrów
```c#embedded
public class HomeController : Controller
{
public static List<Student> students = new List<Student>()
{
new Student()
{
Id=1,
Index=123456,
FirstName = "Daniel",
LastName = "Wilkiewicz"
},
new Student()
{
Id=2,
Index=35453,
FirstName = "Krzysztof",
LastName = "Milewski"
},
}
public IActionResult Index(int id)
{
var student = students.FirstOrDefault(s => s.Id == id);
return View(student);
}
}
```
Metoda `FirstOrDefault` wyszukuje pierwszego studenta, którego pole `Id` jest równe przekazanemu parametrowi.
Parametr dla akcji `Index` zostaje przekazany za pomocą schematu routingu. Przechodząc pod adres `/home/index/1` przyjmuje on wartość 1. W przypadku nie podania wartości parametru i wykonania zapytania pod adres `/home/index` parametr `id` przyjmuje wartość domyślną dla typu `int` czyli 0. Spowoduje to błąd w działaniu aplikacji, gdyż nie istnieje student, którego pole `Id` jest równe 0.
### LINQ
W dużym uproszczeniu jest to rodzaj operacji na kolekcjach.
## Git
System kontroli wersji.
Sprawdzenie wersji git:
```
git --version
```
Klonowanie (pobieranie) repozytorium:
```
git clone adres.url.repozytorium
```
## Resharper
https://www.jetbrains.com/resharper/
###### tags: `.Net PG` `ASP.NET`