Sdílet prostřednictvím


Zkoumání automaticky vygenerovaných podrobností a metod delete

Rick Anderson

Poznámka:

Aktualizovaná verze tohoto kurzu je k dispozici zde pomocí nejnovější verze sady Visual Studio. Nový kurz používá ASP.NET Core MVC, který poskytuje mnoho vylepšení v tomto kurzu.

V tomto kurzu se naučíte ASP.NET Core MVC s řadiči a zobrazeními. Razor Pages je nová alternativa v ASP.NET Core, což je programovací model založený na stránkách, který usnadňuje a zvyšuje produktivitu vytváření webového uživatelského rozhraní. Doporučujeme vyzkoušet kurz Razor Pages před verzí MVC. Kurz Razor Pages:

  • Je jednodušší postupovat.
  • Obsahuje další funkce.
  • Je upřednostňovaným přístupem pro vývoj nových aplikací.

V této části kurzu prozkoumáte automaticky generované Details metody a Delete metody.

Zkoumání metod Details a Delete

Movie Otevřete kontroler a prozkoumejte metoduDetails.

Snímek obrazovky znázorňující kartu Řadiče filmů s tečkou c s V rozevírací nabídce Vytvořit se podrobnosti zakroužkuje červeně.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Modul generování uživatelského rozhraní MVC, který vytvořil tuto metodu akce, přidá komentář zobrazující požadavek HTTP, který vyvolá metodu. V tomto případě se jedná o GET požadavek se třemi segmenty adresy URL, Movies kontrolerem, metodou Details ID a hodnotou.

Code First usnadňuje vyhledávání dat pomocí Find metody. Důležitou bezpečnostní funkcí integrovanou do metody je, že kód ověří, že Find metoda našla film před tím, než se s ním kód pokusí něco udělat. Hacker může například na web zavést chyby změnou adresy URL vytvořené odkazy na http://localhost:xxxx/Movies/Details/1 něco podobného http://localhost:xxxx/Movies/Details/12345 (nebo jinou hodnotu, která nepředstavuje skutečný film). Pokud jste nekontrolovali film s hodnotou null, výsledkem by byla chyba databáze.

Prozkoumejte metody Delete a DeleteConfirmed metody.

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Všimněte si, že metoda HTTP GET Delete neodstraní zadaný film, vrátí zobrazení videa, kde můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo v takovém případě, provedení operace úprav, operace vytvoření nebo jakákoli jiná operace, která mění data) otevře bezpečnostní díru.

Metoda HttpPost , která odstraní data, je pojmenovaná DeleteConfirmed tak, aby metodě HTTP POST poskytla jedinečný podpis nebo název. Níže jsou uvedeny dva podpisy metody:

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

Modul CLR (Common Language Runtime) vyžaduje, aby přetížené metody měly jedinečný podpis parametru (stejný název metody, ale jiný seznam parametrů). Tady ale potřebujete dvě metody Delete – jednu pro GET a druhou pro POST – které mají stejný podpis parametru. (Oba musí jako parametr přijmout jedno celé číslo.)

Pokud to chcete vyřešit, můžete udělat několik věcí. Jedním z nich je dát metodám různé názvy. To je to, co mechanismus generování uživatelského rozhraní udělal v předchozím příkladu. To ale představuje malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu a pokud metodu přejmenujete, směrování obvykle by tuto metodu nemohlo najít. Řešení je to, co vidíte v příkladu, což je přidání ActionName("Delete") atributu do DeleteConfirmed metody. To efektivně provádí mapování pro směrovací systém tak, aby adresa URL, která obsahuje /Delete/ pro požadavek POST, našla metodu DeleteConfirmed .

Dalším běžným způsobem, jak se vyhnout potížím s metodami, které mají identické názvy a podpisy, je uměle změnit podpis metody POST tak, aby zahrnoval nepoužívaný parametr. Někteří vývojáři například přidají typ FormCollection parametru předaný metodě POST a pak tento parametr jednoduše nepoužívají:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Shrnutí

Teď máte úplnou aplikaci ASP.NET MVC, která ukládá data do místní databáze. Můžete vytvářet, číst, aktualizovat, odstraňovat a vyhledávat filmy.

Snímek obrazovky znázorňující stránku indexu M V C Movie Search

Další kroky

Po vytvoření a otestování webové aplikace je dalším krokem zpřístupnění webové aplikace jiným uživatelům, kteří ji budou používat přes internet. Abyste to mohli udělat, musíte ho nasadit na poskytovatele webového hostingu. Microsoft nabízí bezplatné hostování webů až pro 10 webů v bezplatném zkušebním účtu Azure. Navrhuji, abyste se v dalším kurzu řídili nasazením aplikace Zabezpečené ASP.NET MVC s členstvím, OAuth a SQL Database do Azure. Skvělým kurzem je Tom Dykstra zprostředkující úroveň Vytvoření datového modelu Entity Framework pro aplikaci ASP.NET MVC. Stackoverflow a fóra ASP.NET MVC jsou skvělým místem pro kladení otázek. Sledujte na Twitteru, abyste mohli získat aktualizace v mých nejnovějších kurzech.

Zpětná vazba je vítána.

Rick Anderson twitter: @RickAndMSFT
Scott Hanselman twitter: @shanselman