6. část: Metody a zobrazení kontroleru v ASP.NET Core
Autor: Rick Anderson
Máme dobrý začátek filmové aplikace, ale prezentace není ideální, například ReleaseDate by měla být dvě slova.

Otevřete soubor Models/Movie.cs a přidejte zvýrazněné řádky uvedené níže:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
}
}
Poznámky k datům probýme v dalším kurzu. Atribut Display určuje, co se má zobrazit pro název pole (v tomto případě "Datum vydání" místo "ReleaseDate"). Atribut DataType určuje typ dat (Date), takže informace o času uložené v poli se nezobrazují.
Datová poznámka se vyžaduje, aby [Column(TypeName = "decimal(18, 2)")] Entity Framework Core mohli správně namapovat na Price měnu v databázi. Další informace najdete v tématu Datové typy.
Přejděte na Movies kontroler a podržte ukazatel myši nad odkazem Upravit, abyste viděli cílovou adresu URL.

Odkazy Upravit, Podrobnosti a Odstranit generuje základní pomocná rutina značky ukotvení MVC v souboru Views/Movies/Index.cshtml.
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
Pomocná rozšíření značek umožňují, aby se kód na straně serveru mohl podílet na vytváření a vykreslování elementů HTML v Razor souborech. Ve výše uvedeném kódu dynamicky AnchorTagHelper vygeneruje hodnotu atributu HTML z metody akce kontroleru a href ID trasy. K prozkoumání vygenerované značky můžete použít zdroj zobrazení z oblíbeného prohlížeče nebo vývojářské nástroje. Část generovaného kódu HTML je znázorněna níže:
<td>
<a href="/Movies/Edit/4"> Edit </a> |
<a href="/Movies/Details/4"> Details </a> |
<a href="/Movies/Delete/4"> Delete </a>
</td>
Vzpomeňte si na formát směrování nastavený v souboru Program.cs:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
ASP.NET Core se https://localhost:5001/Movies/Edit/4 přeloží na požadavek na Edit metodu akce Movies kontroleru s parametrem Id 4. (Metody kontroleru se také říká metody akce.)
Pomocníci značek jsou jednou z nejoblíbenějších nových funkcí v ASP.NET Core. Další informace najdete v tématu Další zdroje informací.
Otevřete Movies kontroler a prozkoumejte dvě Edit metody akcí. Následující kód ukazuje metodu , která načte film a naplní formulář pro úpravy vygenerovaný HTTP GET Edit souborem Edit.cshtml. Razor
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Následující kód ukazuje HTTP POST Edit metodu , která zpracovává hodnoty zveřejněných filmů:
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
Atribut [Bind] je jedním ze způsob, jak chránit před příliš publikováním. Do atributu byste měli zahrnout pouze [Bind] vlastnosti, které chcete změnit. Další informace najdete v tématu Ochrana kontroleru před přeúčtování. Modely ViewModel nabízejí alternativní přístup, jak zabránit přeúčtování.
Všimněte Edit si, že před druhou metodou akce je atribut [HttpPost] .
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
Atribut HttpPost určuje, že tuto Edit metodu lze vyvolat pouze pro POST požadavky. Atribut můžete použít na první metodu edit, ale to [HttpGet] není nutné, protože [HttpGet] je výchozí.
Atribut slouží k zabránění padělání požadavku a je spárován s tokenem proti padělání vygenerovaný v souboru zobrazení pro úpravy ValidateAntiForgeryToken ( Views/Movies/Edit.cshtml). Soubor zobrazení pro úpravy vygeneruje token proti padělání pomocí pomocníka značky formuláře.
<form asp-action="Edit">
Pomocná metoda značky formuláře vygeneruje skrytý token proti padělku, který se musí shodovat s vygenerovaným tokenem proti padělání v metodě kontroleru [ValidateAntiForgeryToken] Edit Movies. Další informace naleznete v tématu Prevence útoků XSRF/CSRF (Cross-Site Request Forgery) v ASP.NET Core.
Metoda vezme parametr film, vyhledá film pomocí metody Entity Framework a vrátí vybraný film HttpGet Edit ID do zobrazení FindAsync Edit. Pokud se film nenašel, NotFound vrátí se (HTTP 404).
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Když systém generování uživatelského rozhraní vytvořil zobrazení Edit, prozkoumal třídu a vytvořil kód pro vykreslení a elementy pro každou Movie <label> vlastnost <input> třídy. Následující příklad ukazuje zobrazení Edit vygenerované systémem generování Visual Studio uživatelského rozhraní:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<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="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ReleaseDate" class="control-label"></label>
<input asp-for="ReleaseDate" class="form-control" />
<span asp-validation-for="ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Genre" class="control-label"></label>
<input asp-for="Genre" class="form-control" />
<span asp-validation-for="Genre" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Všimněte si, že šablona zobrazení má v horní části souboru @model MvcMovie.Models.Movie příkaz . @model MvcMovie.Models.Movie určuje, že zobrazení očekává, že model šablony zobrazení bude typu Movie .
Kód s generováním kódu používá několik pomocných metod značek ke zjednodušení značek HTML. Pomocná metoda značky popisku zobrazuje název pole ("Title", "ReleaseDate", "Genre" nebo "Price"). Pomocná metoda značky vstupu vykreslí prvek <input> HTML. Pomocná metoda ověřovací značky zobrazí všechny ověřovací zprávy přidružené k této vlastnosti.
Spusťte aplikaci a přejděte na adresu /Movies URL. Klikněte na odkaz Upravit. V prohlížeči zobrazte zdroj stránky. Vygenerovaný kód HTML pro <form> element je zobrazený níže.
<form action="/Movies/Edit/7" method="post">
<div class="form-horizontal">
<h4>Movie</h4>
<hr />
<div class="text-danger" />
<input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" />
<div class="form-group">
<label class="control-label col-md-2" for="Genre" />
<div class="col-md-10">
<input class="form-control" type="text" id="Genre" name="Genre" value="Western" />
<span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Price" />
<div class="col-md-10">
<input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" />
<span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>
</div>
<!-- Markup removed for brevity -->
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" />
</form>
Prvky <input> jsou v HTML <form> elementu, jehož atribut je nastaven na post na adresu action /Movies/Edit/id URL. Data formuláře se při kliknutí na tlačítko zobrazí Save na server. Poslední řádek před uzavíracím </form> elementem zobrazuje skrytý token XSRF vygenerovaný pomocí pomocné pomoci značky formuláře.
Zpracování požadavku POST
Následující výpis ukazuje [HttpPost] verzi Edit metody akce.
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
Atribut [ValidateAntiForgeryToken] ověří skrytý token XSRF vygenerovaný generátorem tokenů proti padělkům v pomocníkovi značky formuláře.
Systém vazby modelu přebírá hodnoty formuláře posted a vytvoří Movie objekt, který se předá jako movie parametr. Vlastnost ověřuje, že data odeslaná ve formuláři lze použít k úpravě (úpravě nebo ModelState.IsValid aktualizaci) Movie objektu. Pokud jsou data platná, uloží se. Aktualizovaná (upravená) data filmů se uloží do databáze voláním SaveChangesAsync metody kontextu databáze. Po uložení dat kód přesměruje uživatele na metodu akce třídy , která zobrazuje kolekci filmů, včetně právě Index MoviesController provedených změn.
Před tím, než se formulář zobrazí na server, ověření na straně klienta zkontroluje všechna ověřovací pravidla pro pole. Pokud dojde k chybám ověřování, zobrazí se chybová zpráva a formulář se nezobrazí. Pokud je JavaScript zakázaný, nebudete mít ověření na straně klienta, ale server zjistí odeslané hodnoty, které nejsou platné, a hodnoty formuláře se znovu zobrazí s chybovou zprávou. Později v tomto kurzu se podrobněji zabýváme ověřením modelu. Pomocná rutina ověřovací značky v šabloně zobrazení Views/Movies/Edit.cshtml se postará o zobrazení příslušných chybových zpráv.

Všechny metody HttpGet na filmové kontroleru mají podobný vzor. Získá objekt filmu (nebo seznam objektů v případě ) a předá objekt Index (model) do zobrazení. Metoda Create předá do zobrazení prázdný objekt Create movie. Všechny metody, které vytvoří, upraví, odstraní nebo jinak upraví data, tak dělají v přetížení [HttpPost] metody . Úprava dat v HTTP GET metodě je bezpečnostním rizikem. Úprava dat v metodě také narušuje osvědčené postupy HTTP a vzor REST architektury, který určuje, že požadavky GET by neměly měnit HTTP GET stav vaší aplikace. Jinými slovy, provedení operace GET by mělo být bezpečná operace, která nemá žádné vedlejší účinky a neupravuje trvalá data.
Další zdroje informací
- Globalizace a lokalizace
- Úvod do pomocníků značek
- Vytváření pomocníků značek
- Prevence útoků XSRF/CSRF (Cross-Site Request Forgery) v ASP.NET Core
- Ochrana kontroleru před přeúčtováním
- Modely ViewModel
- Pomocná rutina značky formuláře
- Pomocná rutina značky vstupu
- Pomocná rutina značky popisku
- Pomocná rutina značky výběru
- Pomocná metoda ověřovací značky
Máme dobrý začátek filmové aplikace, ale prezentace není ideální, například ReleaseDate by měla být dvě slova.

Otevřete soubor Models/Movie.cs a přidejte zvýrazněné řádky uvedené níže:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
}
}
Poznámky k datům probýme v dalším kurzu. Atribut Display určuje, co se má zobrazit pro název pole (v tomto případě "Datum vydání" místo "ReleaseDate"). Atribut DataType určuje typ dat (Date), takže informace o času uložené v poli se nezobrazují.
Datová poznámka se vyžaduje, aby [Column(TypeName = "decimal(18, 2)")] Entity Framework Core mohli správně namapovat na Price měnu v databázi. Další informace najdete v tématu Datové typy.
Přejděte na Movies kontroler a podržte ukazatel myši nad odkazem Upravit, abyste viděli cílovou adresu URL.

Odkazy Upravit, Podrobnosti a Odstranit generuje základní pomocná rutina značky ukotvení MVC v souboru Views/Movies/Index.cshtml.
<a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
<a asp-action="Details" asp-route-id="@item.ID">Details</a> |
<a asp-action="Delete" asp-route-id="@item.ID">Delete</a>
</td>
</tr>
Pomocná rozšíření značek umožňují, aby se kód na straně serveru mohl podílet na vytváření a vykreslování elementů HTML v Razor souborech. Ve výše uvedeném kódu AnchorTagHelper dynamicky generuje href hodnotu atributu HTML z metody akce kontroleru a ID trasy. Pomocí zobrazení zdroje z oblíbeného prohlížeče nebo pomocí vývojářských nástrojů prověřte vygenerovaný kód. Část vygenerovaného kódu HTML je zobrazena níže:
<td>
<a href="/Movies/Edit/4"> Edit </a> |
<a href="/Movies/Details/4"> Details </a> |
<a href="/Movies/Delete/4"> Delete </a>
</td>
Odvolání formátu pro sadu Směrování v souboru Startup. cs :
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
ASP.NET Core se překládá na https://localhost:5001/Movies/Edit/4 požadavek Edit metody action Movies kontroleru s parametrem Id 4. (Metody kontroleru se označují také jako metody akcí.)
Pomocník značek je jednou z nejoblíbenějších nových funkcí v ASP.NET Core. Další informace najdete v tématu Další zdrojeinformací.
Otevřete Movies kontroler a prověřte dvě Edit metody akce. Následující kód ukazuje HTTP GET Edit metodu, která načte film a naplní formulář pro úpravy vygenerovaný souborem Edit. cshtml Razor .
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Následující kód ukazuje HTTP POST Edit metodu, která zpracovává zaúčtované hodnoty filmu:
// POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(movie);
}
[Bind]Atribut je jedním ze způsobů, jak chránit před vyúčtováním. Do [Bind] atributu, který chcete změnit, byste měli zahrnout pouze vlastnosti. Další informace najdete v tématu Chraňte svůj kontroler před vyúčtováním. ViewModels poskytují alternativní přístup, který znemožňuje převzetí služeb při selhání.
Všimněte si, že druhá Edit Metoda Action předchází [HttpPost] atribut.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
HttpPostAtribut určuje, že tuto Edit metodu lze vyvolat pouze pro POST požadavky. Můžete použít [HttpGet] atribut na první metodu Edit, ale to není nutné, protože [HttpGet] je výchozí hodnota.
ValidateAntiForgeryTokenAtribut slouží k zabránění padělání požadavku a je spárován s tokenem odolného proti padělání vygenerovaným v souboru zobrazení pro úpravy (views /Movies/Edit. cshtml). Soubor pro úpravu zobrazení vygeneruje token proti padělání pomocí pomocníka značky formuláře.
<form asp-action="Edit">
Pomocník značek formuláře generuje skrytý token proti padělání, který se musí shodovat s [ValidateAntiForgeryToken] generovaným tokenem odolného proti padělání v Edit metodě kontroleru filmů. Další informace naleznete v tématu Prevence útoků XSRF/CSRF (Cross-Site Request Forgery) v ASP.NET Core.
HttpGet EditMetoda vezme ID parametr videa, vyhledá film pomocí metody Entity Framework FindAsync a vrátí vybraný film do zobrazení pro úpravy. Pokud se video nenajde, NotFound vrátí se (HTTP 404).
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Když systém generování uživatelského rozhraní vytvořil zobrazení pro úpravy, zkontroloval Movie třídu a vytvořil kód pro vykreslení <label> a <input> prvky pro každou vlastnost třídy. následující příklad ukazuje zobrazení pro úpravy, které bylo vygenerováno Visual Studioým systémem generování uživatelského rozhraní:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<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="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ReleaseDate" class="control-label"></label>
<input asp-for="ReleaseDate" class="form-control" />
<span asp-validation-for="ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Genre" class="control-label"></label>
<input asp-for="Genre" class="form-control" />
<span asp-validation-for="Genre" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Všimněte si, jak šablona zobrazení obsahuje @model MvcMovie.Models.Movie příkaz v horní části souboru. @model MvcMovie.Models.Movie Určuje, že zobrazení očekává, že model pro šablonu zobrazení bude typu Movie .
Generovaný kód používá několik pomocných metod značek pro zjednodušení značek HTML. Pomocník značek Label zobrazí název pole ("title", "ReleaseDate", "Žánr" nebo "Price"). Pomocná rutina vstupní značky VYKRESLUJE <input> prvek HTML. Pomocník pro ověřování značek zobrazí všechny ověřovací zprávy přidružené k této vlastnosti.
Spusťte aplikaci a přejděte na /Movies adresu URL. Klikněte na odkaz Upravit . V prohlížeči zobrazte zdroj stránky. Vygenerovaný kód HTML pro <form> element je uveden níže.
<form action="/Movies/Edit/7" method="post">
<div class="form-horizontal">
<h4>Movie</h4>
<hr />
<div class="text-danger" />
<input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" />
<div class="form-group">
<label class="control-label col-md-2" for="Genre" />
<div class="col-md-10">
<input class="form-control" type="text" id="Genre" name="Genre" value="Western" />
<span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Price" />
<div class="col-md-10">
<input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" />
<span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>
</div>
<!-- Markup removed for brevity -->
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" />
</form>
<input>Prvky jsou v elementu, HTML <form> jehož action atribut je nastaven na hodnotu post na /Movies/Edit/id adresu URL. Data formuláře budou při kliknutí na tlačítko publikována na serveru Save . Poslední řádek před uzavíracím </form> prvkem zobrazuje skrytý token XSRF generovaný pomocníkem značek formuláře.
Zpracovává se žádost POST.
Následující výpis zobrazuje [HttpPost] verzi Edit metody Action.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
[ValidateAntiForgeryToken]Atribut ověří skrytý token XSRF generovaný generátorem tokenů ochrany proti padělání v pomocné rutině značky Form .
Systém vázání modelů přebírá hodnoty v zaúčtovaném formuláři a vytvoří Movie objekt, který je předán jako movie parametr. ModelState.IsValidVlastnost ověřuje, že data odeslaná ve formuláři lze použít k úpravě (úpravě nebo aktualizaci) Movie objektu. Pokud jsou data platná, uloží se. Aktualizované (upravené) filmové údaje jsou uloženy do databáze voláním SaveChangesAsync metody kontextu databáze. Po uložení dat kód přesměruje uživatele na Index metodu Action MoviesController třídy, která zobrazí kolekci filmů, včetně změn, které byly právě provedeny.
Předtím, než se formulář pošle na server, ověřování na straně klienta zkontroluje všechna pravidla ověřování v polích. Pokud dojde k chybám ověření, zobrazí se chybová zpráva a formulář se nepublikuje. Pokud je JavaScript zakázaný, nebudete mít ověřování na straně klienta, ale server detekuje odeslané hodnoty, které nejsou platné, a hodnoty formuláře se zobrazí znovu s chybovými zprávami. Později v tomto kurzu prověříme ověřování modelu podrobněji. Pomocný modul pro ověření značky v šabloně zobrazení /filmy/upravit. cshtml se postará o zobrazení příslušných chybových zpráv.

Všechny HttpGet metody v kontroleru filmů následují podobně jako vzor. Získají filmový objekt (nebo seznam objektů v případě Index ) a předá do zobrazení objekt (model). CreateMetoda předá do zobrazení prázdný objekt filmu Create . Všechny metody, které vytvářejí, upravují, odstraňují nebo jinak upravují data, jsou v [HttpPost] přetížení metody. Úprava dat v HTTP GET metodě je bezpečnostní riziko. Úpravy dat v HTTP GET metodě také porušují osvědčené postupy http a model REST architektury, který určuje, že požadavky GET by neměly měnit stav aplikace. Jinými slovy, provádění operace GET by mělo být bezpečná operace, která nemá žádné vedlejší účinky a neupravuje vaše trvalá data.
Další zdroje informací
- Globalizace a lokalizace
- Úvod k pomocníkům značek
- Vytváření pomocníků se značkami
- Prevence útoků XSRF/CSRF (Cross-Site Request Forgery) v ASP.NET Core
- Chraňte svůj kontroler před vyúčtováním
- ViewModels
- Pomocná rutina značky formuláře
- Pomocná rutina značky vstupu
- Pomocná rutina značky popisku
- Pomocná rutina značky výběru
- Pomocná značka ověřovací značky