Programování
MVC Formuláře
Formuláře v ASP.NET MVC slouží k zachycení dat od uživatele a jejich odeslání na server pro zpracování. Jsou klíčovou součástí webových aplikací, které umožňují uživatelům interaktivně komunikovat s webem a zadávat různé informace.
Generování formuláře
1. Vytvoření databáze
Zde stahnout projekt ExerciseWebForm

Generování formuláře jde přes entityframework a je potřeba mít v projektu context.
Pokud chcete následovat návod, zde je jak vytvořit rychle databázi

Vytvořte databázi se jménem ExerciseDatabase v Mssql
    

USE [ExerciseDatabase]
GO

/****** jednoduchá tabulka ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

DROP TABLE [dbo].[Person];


GO
CREATE TABLE [dbo].[Person] (
    [Id]        INT          NOT NULL,
    [FirstName] VARCHAR (50) NOT NULL,
    [LastName]  VARCHAR (50) NOT NULL,
    [Age]       INT          NOT NULL
);

    
Do projektu vložte tyto Nuget balíčky se správnou verzi (první číslo ve verzi balíčku odpovídá .Net core verzi)
Používám .Net 7 > hledám balíčky, které začínaji na 7 (třeba 7.0.18) Následně otevřete "Package Manager Console" a použijete tento příkaz
    

Scaffold-DbContext 
"Sem connection string" 
Microsoft.EntityFrameworkCore.SqlServer 
-OutputDir DbModels 
-ContextDir DbContext 
    
Příkaz vygeneruje Context a modely databáze, které tam vložíte
  • DbModels - se budou nacházet tabulky, které jsou v databázi
  • DbContext - bude context
Podrobnější návod zde: learn.microsoft
2. Vygenerování
  1. Kliknout na controller a přidat controller with views using entityFramework
  2. Vyplnit údaje
  3. Počkat
  4. Vše by se mělo udělat
Formulářové prvky
Label
    
<label asp-for="FirstName" class="control-label"></label>
    
asp-for dává do innerhtml, neboli textu, název té proměné
Pokud chceme v kodu změnit co ukazuje používáme attribut [DisplayName("Jméno")]. Tohle změní co se napíše ve formu v labelu
Input
    
<input asp-for="FirstName" class="form-control" />
    
Prostě políčko pro vyplnění honoty.
ASP je dostatečně chytré a dokáže rozpoznat typ a následně poskytne input type samo od sebe.
String > type="Text" Int > type="Number"
Button - submit
    
<input type="submit" value="Save" class="btn btn-primary" />
    
Slouží pro odeslání modelu na server
Zpracování formuláře
Po kliknutí tlačíka submit, odešle se Pouze Model do metody
Pro určetní jak do jaké akce se má poslat, musíme určit v <form> tagu
    
<form asp-action="Edit">
    
Následně takovou metodu edit, musíme označit atributem [HttpPost] protože přijmá odeslané data.
    
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,FirstName,LastName,Age")] Person person)

/*
Pokud vycházíte z vygenerované části, tak takto vypadá edit
*/


[HttpPost]
public IActionResult Edit(Person person)

/*
Tohle je uplně stejný zápis, 
ale má jinou funkčnost na pozadí, ale data dostanete stejný
*/

    
Vysvětlení:
  • [HttpPost]
    - Označujeme, že přijmá data z formuláře, nebo z akce označené jako Post
  • [ValidateAntiForgeryToken]
    - slouží k ochraně proti útokům typu Cross-Site Request Forgery (CSRF). Tyto útoky se pokoušejí zneužít přihlášení uživatele k webové aplikaci k odesílání požadavků na server bez jeho vědomí.
  • async Task<IActionResult>
    - Tohle děla metodu asynchroní, v realné případě je to nutnost, protože asp server je jedno thredový, takže řeší akce postupně. Tohle mu dáva možnost dělat každou akci zároveň. V důsledku toho prostě stihne dělat věci najednou. NENI nutné, při dělání malých webů
  • (viz. obrázek)
  • [Bind("Id,FirstName,LastName,Age")]
    - není opět potřeba, ale slouží ke zvýšení zabezpečenosti a výkonu. jednoduše váže atributy Person na to co se dosatalo z Post
Následně je jednoduchá práce s databázi na CRUD operace.
Validace hodnot
Pro validaci hodnot, musíme stanovit kritéria, podle kterých se bude řídit validace. Validace je automaticky vytvořená na základě těchto atributů.
    
public class Person
{
    [Required]
    public string Jméno { get; set; }

    [Range(18, 100)]
    public int Věk { get; set; }

    [RegularExpression("[a-zA-Z]+")]
    public string Příjmení { get; set; }
    
    // Zde také mužeme určit od do
    [MaxLength(50)]
    [MinLength(25)]

    // nebo, jen délku do
    [StringLength(50)]
    public string Adresa { get; set; }
    
    [EmailAddress]
    public string Email { get; set; }

    [Phone]
    public string Telefon { get; set; }

}
    
Jako sekundární parametr, těchto atributů je Error message, která se vypíše při vložení špatné hodnoty. Vkládáme jako

ErrorMessage = "Text"
    
public class Person
{
    [Required(ErrorMessage = "Je nutne")]
    public string Jméno { get; set; }

    [Range(5,10,ErrorMessage = "Rozsah je spatny")]
    public int Věk { get; set; }

    // nebo, jen délku do
    [StringLength(50)]
    public string Adresa { get; set; }
    
    [EmailAddress(ErrorMessage = "Spatný mail")]
    public string Email { get; set; }

    // Funguje u všech
}
    
Validace na html stránce
Za validaci hodnot odpovída tento kód
  • asp-validation-for="FirstName"
    Tohle odpovídá za konkrétní validaci parametru
  • <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    - tohle odpovídá za validaci všeho
    
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Id" />
            <div class="form-group">
                <label asp-for="FirstName" class="control-label"></label>
                <input asp-for="FirstName" class="form-control" />
                <span asp-validation-for="FirstName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="LastName" class="control-label"></label>
                <input asp-for="LastName" class="form-control" />
                <span asp-validation-for="LastName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Age" class="control-label"></label>
                <input asp-for="Age" class="form-control" />
                <span asp-validation-for="Age" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    
Následně můžeme kontrolovat ještě model v c#, přes ModelState.IsValid vrací true, pokud není chyba. Vrací false pokud je chyba.
TIP: přes debugger, mužeme zjistit, co je zle. Obsahuje to ModelState
Session
Session slouží k uchování dat na straně serveru po dobu trvání relace uživatele. Na rozdíl od proměnných view, které existují pouze během zpracovávání jednoho požadavku, session umožňuje ukládat a načítat data napříč různými požadavky od stejného uživatele.

Pro spovoznění sessions je potřeba přidat kod do program.cs
    
builder.Services.AddSession(); 
// Musíme přidat před metodou .Build();

var app = builder.Build();

app.UseSession();
    
    
// Uložíme
HttpContext.Session.SetString("key", "Hodnota");

// Načteme
HttpContext.Session.GetString("key");

// Jde udělat pouze v controlerech, jelikož dědí z Controlleru