Kurz: Implementace funkcí CRUD pomocí Entity Frameworku v ASP.NET MVC
V předchozím kurzu jste vytvořili aplikaci MVC, která ukládá a zobrazuje data pomocí Entity Frameworku (EF) 6 a SQL Server LocalDB. V tomto kurzu si prohlédnete a přizpůsobíte kód CRUD (vytvoření, čtení, aktualizace, odstranění), který pro vás v řadičích a zobrazeních automaticky vytvoří generování uživatelského rozhraní MVC.
Poznámka
Běžnou praxí je implementovat vzor úložiště, aby se mezi kontrolerem a vrstvou přístupu k datům vytvořila abstraktní vrstva. Aby byly tyto kurzy jednoduché a zaměřené na výuku používání samotného EF 6, nepoužívají úložiště. Informace o implementaci úložišť najdete v mapě obsahu ASP.NET Data Access.
Tady jsou příklady webových stránek, které vytvoříte:
V tomto kurzu jste:
- Vytvoření stránky podrobností
- Aktualizace stránky Vytvořit
- Aktualizace metody HttpPost Edit
- Aktualizace stránky Odstranit
- Zavřít databázová připojení
- Zpracování transakcí
Požadavky
Vytvoření stránky podrobností
Vygenerovaný kód stránky Studenti Index
vynechal Enrollments
vlastnost, protože tato vlastnost obsahuje kolekci. Details
Na stránce zobrazíte obsah kolekce v tabulce HTML.
V souboru Controllers\StudentController.cs metoda akce pro Details
zobrazení používá metodu Find k načtení jedné Student
entity.
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
Hodnota klíče je předána metodě jako id
parametr a pochází z dat trasy v hypertextovém odkazu Podrobnosti na stránce Index.
Tip: Směrování dat
Směrovací data jsou data, která modelový pořadač našel v segmentu adresy URL zadaném ve směrovací tabulce. Výchozí trasa například určuje controller
, action
a id
segmenty:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Na následující adrese URL se výchozí trasa mapuje Instructor
jako controller
, Index
jako action
a 1 jako id
. Jedná se o datové hodnoty trasy.
http://localhost:1230/Instructor/Index/1?courseID=2021
?courseID=2021
je hodnota řetězce dotazu. Pořadač modelu bude fungovat také v případě, že jako hodnotu řetězce dotazu předáte id
hodnotu:
http://localhost:1230/Instructor/Index?id=1&CourseID=2021
Adresy URL se vytvářejí příkazy ActionLink
v zobrazení Razor. V následujícím kódu id
se parametr shoduje s výchozí trasou, takže id
se přidá do dat trasy.
@Html.ActionLink("Select", "Index", new { id = item.PersonID })
V následujícím kódu courseID
neodpovídá parametru ve výchozí trase, takže se přidá jako řetězec dotazu.
@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })
Vytvoření stránky Podrobnosti
Otevřete Soubor Views\Student\Details.cshtml.
Každé pole se zobrazí pomocí pomocné rutiny
DisplayFor
, jak je znázorněno v následujícím příkladu:<dt> @Html.DisplayNameFor(model => model.LastName) </dt> <dd> @Html.DisplayFor(model => model.LastName) </dd>
EnrollmentDate
Za pole a těsně před uzavírací</dl>
značku přidejte zvýrazněný kód, který zobrazí seznam registrací, jak je znázorněno v následujícím příkladu:<dt> @Html.DisplayNameFor(model => model.EnrollmentDate) </dt> <dd> @Html.DisplayFor(model => model.EnrollmentDate) </dd> <dt> @Html.DisplayNameFor(model => model.Enrollments) </dt> <dd> <table class="table"> <tr> <th>Course Title</th> <th>Grade</th> </tr> @foreach (var item in Model.Enrollments) { <tr> <td> @Html.DisplayFor(modelItem => item.Course.Title) </td> <td> @Html.DisplayFor(modelItem => item.Grade) </td> </tr> } </table> </dd> </dl> </div> <p> @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) | @Html.ActionLink("Back to List", "Index") </p>
Pokud je odsazení kódu po vložení chybné, naformátujte ho stisknutím kláves Ctrl+K, Ctrl+D .
Tento kód prochází entitami ve
Enrollments
vlastnosti navigation. Pro každouEnrollment
entitu ve vlastnosti se zobrazí název kurzu a známka. Název kurzu se načte zCourse
entity, která je uložená veCourse
vlastnostiEnrollments
navigace entity. Všechna tato data se z databáze načítají automaticky, když je potřeba. Jinými slovy, zde používáte opožděné načítání. Neurčili jste nedočkavé načítání proCourses
vlastnost navigace, takže registrace nebyly načteny ve stejném dotazu, který získal studenty. Místo toho se při prvním pokusuEnrollments
o přístup k vlastnosti navigace odešle do databáze nový dotaz, který načte data. Další informace o opožděných a dychtivých načítáních si můžete přečíst v kurzu Čtení souvisejících dat dále v této sérii.Otevřete stránku Podrobnosti tak, že spustíte program (Ctrl+F5), vyberete kartu Studenti a potom kliknete na odkaz Podrobnosti pro Alexandera Carsona. (Pokud stisknete klávesu Ctrl+F5 , když je soubor Details.cshtml otevřený, zobrazí se chyba HTTP 400. Je to proto, že visual Studio se pokusí spustit stránku Podrobnosti, ale nebyla přístupná z odkazu, který určuje studenta, který má zobrazit. Pokud k tomu dojde, odeberte z adresy URL položku Student/Details a zkuste to znovu, nebo zavřete prohlížeč, klikněte pravým tlačítkem myši na projekt a klikněte na Zobrazit>zobrazení v prohlížeči.)
Zobrazí se seznam kurzů a známek vybraného studenta.
Zavřete prohlížeč.
Aktualizace stránky Vytvořit
V souboru Controllers\StudentController.cs nahraďte metodu HttpPostAttribute
Create
action následujícím kódem. Tento kód přidátry-catch
blok a odebere z atributu BindAttribute pro vygenerovanouID
metodu:[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student) { try { if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); } } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator."); } return View(student); }
Tento kód přidá entitu
Student
vytvořenou pořadačem modelu ASP.NET MVC doStudents
sady entit a pak uloží změny do databáze. Pořadač modelu odkazuje na funkci ASP.NET MVC, která usnadňuje práci s daty odeslanými formulářem; Pořadač modelu převede odeslané hodnoty formuláře na typy CLR a předá je metodě akce v parametrech. V tomto případě pořadač modelu vytvoří instanciStudent
entity pomocí hodnot vlastností zForm
kolekce.Odebrali
ID
jste z atributu Bind, protožeID
je hodnota primárního klíče, kterou SQL Server nastaví automaticky při vložení řádku. Vstup od uživatele nenastavíID
hodnotu.Upozornění zabezpečení – atribut
ValidateAntiForgeryToken
pomáhá zabránit útokům na padělání požadavků mezi weby . Vyžaduje odpovídajícíHtml.AntiForgeryToken()
příkaz v zobrazení, který uvidíte později.Atribut
Bind
je jedním ze způsobů, jak chránit před nadměrným účtováním ve scénářích vytváření. Předpokládejme například, že entitaStudent
obsahujeSecret
vlastnost, kterou nechcete nastavit na této webové stránce.public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public string Secret { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }
I v případě, že
Secret
na webové stránce nemáte pole, může hacker použít nástroj, jako je fiddler, nebo napsat javascript k publikováníSecret
hodnoty formuláře. BindAttribute Aniž by atribut omezoval pole, která model binder používá při vytvářeníStudent
instance, pořadač modelu by tuto hodnotu formuláře vybralSecret
a použil ji k vytvořeníStudent
instance entity. Pak se ve vaší databázi aktualizuje jakákoli hodnota, kterou hacker zadal proSecret
pole formuláře. Následující obrázek znázorňuje nástroj fiddler, kterýSecret
přidává pole (s hodnotou OverPost) k hodnotám zaúčtovaného formuláře.Hodnota OverPost by pak byla úspěšně přidána do
Secret
vlastnosti vloženého řádku, i když jste nikdy neměli v úmyslu, aby webová stránka mohla tuto vlastnost nastavit.Nejlepší je použít
Include
parametr s atributemBind
k explicitní výpisu polí. Parametr je také možné použítExclude
k blokování polí, která chcete vyloučit. DůvodemInclude
je bezpečnější to, že když do entity přidáte novou vlastnost, není nové pole automaticky chráněno seznamemExclude
.Ve scénářích úprav můžete zabránit nadměrnému příspěvku tím, že nejprve přečtete entitu z databáze a pak zavoláte
TryUpdateModel
a předáte explicitní seznam povolených vlastností. To je metoda používaná v těchto kurzech.Alternativním způsobem, jak zabránit nadměrnému příspěvku, který upřednostňuje mnoho vývojářů, je použít modely zobrazení místo tříd entit s vazbou modelu. Zahrňte pouze vlastnosti, které chcete aktualizovat v modelu zobrazení. Po dokončení pořadače modelu MVC zkopírujte vlastnosti modelu zobrazení do instance entity, volitelně pomocí nástroje, jako je AutoMapper. Použijte db. Položka v instanci entity pro nastavení jejího stavu na Nezměněno a pak nastavit Vlastnost("PropertyName"). IsModified na hodnotu true u každé vlastnosti entity, která je součástí modelu zobrazení. Tato metoda funguje ve scénářích úprav i vytváření.
Kromě atributu
Bind
je blok jedinou změnou,try-catch
kterou jste udělali v vygenerovaného kódu. Pokud se při ukládání změn zachytí výjimka odvozená z DataException , zobrazí se obecná chybová zpráva. DataException Výjimky jsou někdy způsobeny něčím externím pro aplikaci místo programovací chyby, takže se uživateli doporučuje, aby to zkusil znovu. I když tato ukázka není implementovaná, aplikace pro produkční kvality by výjimku protokolovala. Další informace najdete v části Protokol pro přehled v tématu Monitorování a telemetrie (vytváření Real-World cloudových aplikací s Azure).Kód v souboru Views\Student\Create.cshtml je podobný tomu, který jste viděli v souboru Details.cshtml s tím rozdílem, že
EditorFor
pomocné rutiny aValidationMessageFor
se používají pro každé pole místo .DisplayFor
Tady je příslušný kód:<div class="form-group"> @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName) </div> </div>
Create.cshtml také obsahuje
@Html.AntiForgeryToken()
, který pracuje s atributemValidateAntiForgeryToken
v kontroleru a pomáhá zabránit útokům na padělání požadavků mezi weby .V souboru Create.cshtml nejsou vyžadovány žádné změny.
Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na Vytvořit nový.
Zadejte jména a neplatné datum a kliknutím na Vytvořit zobrazte chybovou zprávu.
Toto je ověření na straně serveru, které získáte ve výchozím nastavení. V pozdějším kurzu se dozvíte, jak přidat atributy, které generují kód pro ověření na straně klienta. Následující zvýrazněný kód ukazuje kontrolu ověření modelu v metodě Create .
if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); }
Změňte datum na platnou hodnotu a kliknutím na Vytvořit zobrazte nového studenta na stránce Index .
Zavřete prohlížeč.
Aktualizovat metodu HttpPost Edit
Nahraďte metodu HttpPostAttribute
Edit
action následujícím kódem:[HttpPost, ActionName("Edit")] [ValidateAntiForgeryToken] public ActionResult EditPost(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var studentToUpdate = db.Students.Find(id); if (TryUpdateModel(studentToUpdate, "", new string[] { "LastName", "FirstMidName", "EnrollmentDate" })) { try { db.SaveChanges(); return RedirectToAction("Index"); } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); } } return View(studentToUpdate); }
Poznámka
V souboru Controllers\StudentController.cs
HttpGet Edit
metoda (bez atributuHttpPost
) používá metoduFind
k načtení vybranéStudent
entity, jak jste viděli vDetails
metodě. Tuto metodu nemusíte měnit.Tyto změny implementují osvědčený postup zabezpečení, aby se zabránilo nadměrnému umístění. Generátor kódu vygeneroval
Bind
atribut a přidal entitu vytvořenou pořadačem modelu do sady entit s příznakem Modified. Tento kód se už nedoporučuje, protožeBind
atribut vymaže všechna předem existující data v polích, která nejsou uvedená v parametruInclude
. V budoucnu se scaffolder kontroleru MVC aktualizuje tak, aby negenerovalBind
atributy pro metody Edit.Nový kód čte existující entitu a volá TryUpdateModel k aktualizaci polí ze vstupu uživatele v datech zaúčtovaných formulářů. Automatické sledování změn Entity Framework nastaví u entity příznak EntityState.Modified . Při volání SaveChanges metoda příznak způsobí, Modified že Entity Framework vytvoří příkazy SQL pro aktualizaci řádku databáze. Konflikty souběžnosti se ignorují a aktualizují se všechny sloupce řádku databáze, včetně těch, které uživatel nezměnil. (V pozdějším kurzu se dozvíte, jak řešit konflikty souběžnosti, a pokud chcete, aby se v databázi aktualizovala jenom jednotlivá pole, můžete entitu nastavit na EntityState.Nezměněno a jednotlivá pole nastavit na EntityState.Modified.)
Chcete-li zabránit nadměrnému vkládání, jsou pole, která chcete aktualizovat pomocí stránky Upravit, uvedena v parametrech
TryUpdateModel
. V současné době nejsou k dispozici žádná další pole, která chráníte, ale výpis polí, která má pořadač modelu svázat, zajistí, že pokud do datového modelu v budoucnu přidáte pole, budou automaticky chráněná, dokud je sem explicitně nepřidáte.V důsledku těchto změn podpis metody HttpPost Edit metoda je stejný jako HttpGet edit metoda; Proto jste přejmenovali metodu EditPost.
Tip
Stavy entit a metody Attach a SaveChanges
Kontext databáze sleduje, jestli jsou entity v paměti synchronizované s odpovídajícími řádky v databázi, a tyto informace určují, co se stane při volání
SaveChanges
metody . Když například předáte novou entitu metodě Add , stav této entity se nastaví naAdded
. Když pak zavoláte metodu SaveChanges , kontext databáze vydá příkaz SQLINSERT
.Entita může být v jednom z následujících stavů:
Added
. Entita ještě v databázi neexistuje. MetodaSaveChanges
musí vydatINSERT
příkaz .Unchanged
. S touto entitou není potřeba nic dělat metodouSaveChanges
. Když načtete entitu z databáze, začne entita s tímto stavem.Modified
. Některé nebo všechny hodnoty vlastností entity byly změněny. MetodaSaveChanges
musí vydatUPDATE
příkaz .Deleted
. Entita byla označena k odstranění. MetodaSaveChanges
musí vydatDELETE
příkaz .Detached
. Entita není sledována kontextem databáze.
V desktopové aplikaci se změny stavu obvykle nastavují automaticky. V desktopové aplikaci přečtete entitu a provedete změny některých hodnot jejích vlastností. To způsobí, že stav entity se automaticky změní na
Modified
. Když pak zavoláteSaveChanges
, Entity Framework vygeneruje příkaz SQLUPDATE
, který aktualizuje pouze skutečné vlastnosti, které jste změnili.Odpojená povaha webových aplikací neumožňuje tuto souvislou sekvenci. DbContext, který čte entitu, se po vykreslení stránky odstraní.
HttpPost
Edit
Při volání metody action je proveden nový požadavek a máte novou instanci DbContext, takže musíte ručně nastavit stav entity naModified.
Pak při voláníSaveChanges
entity Entity Framework aktualizuje všechny sloupce řádku databáze, protože kontext nemůže zjistit, které vlastnosti jste změnili.Pokud chcete, aby příkaz SQL
Update
aktualizoval pouze pole, která uživatel skutečně změnil, můžete původní hodnoty uložit nějakým způsobem (například skrytá pole), aby byly při volání metody k dispoziciHttpPost
Edit
. Pak můžete vytvořit entituStudent
s použitím původních hodnot, volat metoduAttach
s původní verzí entity, aktualizovat hodnoty entity na nové hodnoty a pak zavolatSaveChanges.
volání Další informace najdete v tématech Stavy entit a SaveChanges a Local Data.Kód HTML a Razor v souboru Views\Student\Edit.cshtml je podobný kódu, který jste viděli v souboru Create.cshtml, a nevyžaduje se žádné změny.
Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na hypertextový odkaz Upravit.
Změňte některá data a klikněte na Uložit. Změněná data se zobrazí na stránce Index.
Zavřete prohlížeč.
Aktualizace stránky Pro odstranění
Kód šablony metody HttpGetAttributeDelete
v souboru Controllers\StudentController.cs používá metodu Find
k načtení vybrané Student
entity, jak jste viděli v Details
metodách a Edit
. Pokud však chcete implementovat vlastní chybovou zprávu, když volání selže SaveChanges
, přidáte do této metody a jejího odpovídajícího zobrazení určité funkce.
Jak jste viděli u operací aktualizace a vytvoření, operace odstranění vyžadují dvě metody akce. Metoda, která je volána v reakci na požadavek GET, zobrazí zobrazení, které uživateli dává možnost schválit nebo zrušit operaci odstranění. Pokud ho uživatel schválí, vytvoří se žádost POST. Když k tomu dojde, HttpPost
Delete
zavolá se metoda a pak tato metoda skutečně provede operaci odstranění.
Do metody přidáte blokHttpPostAttributeDelete
, try-catch
který zpracuje případné chyby, ke kterým může dojít při aktualizaci databáze. Pokud dojde k chybě, HttpPostAttributeDelete
metoda zavolá metodu HttpGetAttributeDelete
a předá jí parametr, který označuje, že došlo k chybě. Metoda HttpGetAttributeDelete
pak znovu zobrazí potvrzovací stránku spolu s chybovou zprávou, takže uživatel může akci zrušit nebo to zkusit znovu.
Nahraďte metodu HttpGetAttribute
Delete
akce následujícím kódem, který spravuje zasílání zpráv o chybách:public ActionResult Delete(int? id, bool? saveChangesError=false) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } if (saveChangesError.GetValueOrDefault()) { ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator."; } Student student = db.Students.Find(id); if (student == null) { return HttpNotFound(); } return View(student); }
Tento kód přijímá volitelný parametr , který označuje, jestli byla metoda volána po neúspěšné uložení změn. Tento parametr je
false
,HttpGet
Delete
když je volána metoda bez předchozího selhání. Když je volána metodouHttpPost
Delete
v reakci na chybu aktualizace databáze, parametr jetrue
a do zobrazení se předá chybová zpráva.Nahraďte metodu HttpPostAttribute
Delete
akce (s názvemDeleteConfirmed
) následujícím kódem, který provede skutečnou operaci odstranění a zachytí všechny chyby aktualizace databáze.[HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id) { try { Student student = db.Students.Find(id); db.Students.Remove(student); db.SaveChanges(); } catch (DataException/* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. return RedirectToAction("Delete", new { id = id, saveChangesError = true }); } return RedirectToAction("Index"); }
Tento kód načte vybranou entitu a pak zavolá metodu Remove , která nastaví stav entity na
Deleted
. PřiSaveChanges
volání se vygeneruje příkaz SQLDELETE
. Také jste změnili název metody akce zDeleteConfirmed
naDelete
. Vygenerovaný kód s názvemHttpPost
Delete
metodaDeleteConfirmed
dáváHttpPost
metodě jedinečný podpis. (ClR vyžaduje, aby přetížené metody měly různé parametry metody.) Teď, když jsou podpisy jedinečné, můžete zůstat u konvence MVC a použít stejný název proHttpPost
metody aHttpGet
delete.Pokud je zvýšení výkonu v aplikaci s velkým objemem prioritou, můžete se vyhnout zbytečnému dotazu SQL pro načtení řádku nahrazením řádků kódu, které volají
Find
metody aRemove
následujícím kódem:Student studentToDelete = new Student() { ID = id }; db.Entry(studentToDelete).State = EntityState.Deleted;
Tento kód vytvoří
Student
instanci entity pouze s použitím hodnoty primárního klíče a pak nastaví stav entity naDeleted
. To je vše, co Entity Framework potřebuje k odstranění entity.Jak jsme uvedli
HttpGet
Delete
, metoda neodstraní data. Provedení operace odstranění v reakci na požadavek GET (nebo provedení jakékoli operace úprav, operace vytvoření nebo jiné operace, která mění data) představuje bezpečnostní riziko. Další informace najdete v tématu tip ASP.NET MVC #46 – Nepoužívejte odstranit odkazy, protože vytvářejí bezpečnostní díry na blogu Stephena Walthera.V souboru Views\Student\Delete.cshtml přidejte mezi
h2
nadpis a nadpis chybovouh3
zprávu, jak je znázorněno v následujícím příkladu:<h2>Delete</h2> <p class="error">@ViewBag.ErrorMessage</p> <h3>Are you sure you want to delete this?</h3>
Spusťte stránku tak, že spustíte program, vyberete kartu Studenti a potom kliknete na hypertextový odkaz Odstranit.
Na stránce s textem Opravdu chcete toto odstranit, zvolte Odstranit.
Stránka Rejstřík se zobrazí bez odstraněného studenta. (Příklad kódu pro zpracování chyb v akci uvidíte v kurzu souběžnosti.)
Zavřít databázová připojení
Pokud chcete databázová připojení zavřít a co nejdříve uvolnit prostředky, které obsahují, odstraňte instanci kontextu, jakmile s ní skončíte. Proto vygenerovaný kód poskytuje metodu Dispose na konci StudentController
třídy v souboru StudentController.cs, jak je znázorněno v následujícím příkladu:
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
Základní Controller
třída již implementuje IDisposable
rozhraní, takže tento kód jednoduše přidá přepsání do Dispose(bool)
metody pro explicitní odstranění instance kontextu.
Zpracování transakcí
Ve výchozím nastavení Entity Framework implicitně implementuje transakce. Ve scénářích, kdy provedete změny ve více řádcích nebo tabulkách a pak zavoláte SaveChanges
metodu , Entity Framework automaticky zajistí, že buď všechny vaše změny proběhnou úspěšně, nebo všechny selžou. Pokud jsou některé změny provedeny jako první a pak dojde k chybě, tyto změny se automaticky vrátí zpět. Scénáře, ve kterých potřebujete větší kontrolu – například pokud chcete do transakce zahrnout operace prováděné mimo Entity Framework – přečtěte si téma Práce s transakcemi.
Získání kódu
Další materiály
Teď máte úplnou sadu stránek, které provádějí jednoduché operace CRUD pro Student
entity. Použili jste pomocné rutiny MVC ke generování prvků uživatelského rozhraní pro datová pole. Další informace o pomocných rutinách MVC najdete v tématu Vykreslování formuláře pomocí pomocných rutin HTML (článek je určený pro MVC 3, ale stále platí pro MVC 5).
Odkazy na další prostředky EF 6 najdete v tématu ASP.NET Data Access – doporučené zdroje.
Další kroky
V tomto kurzu jste:
- Vytvoření stránky s podrobnostmi
- Aktualizovala se stránka Vytvořit.
- Aktualizace metody HttpPost Edit
- Stránka Odstranit se aktualizovala.
- Uzavřený databázová připojení
- Zpracovávané transakce
V dalším článku se dozvíte, jak do projektu přidat řazení, filtrování a stránkování.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro