Zkoumání metod akce Podrobnosti a Odstranění

Rick Anderson

Poznámka

Aktualizovaná verze tohoto kurzu je k dispozici tady, která používá ASP.NET MVC 5 a Visual Studio 2013. Je bezpečnější, mnohem jednodušší sledovat a ukazuje více funkcí.

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, který zobrazuje kartu Kontroleru filmů dot c s Podrobnosti jsou vybrány v rozevírací nabídce napravo.

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ý volá metodu. V tomto případě se jedná o požadavek se GET třemi segmenty adresy URL, Movies kontrolerem, Details metodou ID a hodnotou.

Code First usnadňuje vyhledávání dat pomocí Find metody . Důležitou funkcí zabezpečení, která je součástí metody, je to, že kód ověří, že Find metoda našla film předtím, než se s ním kód pokusí něco udělat. Hacker může například do webu zavádět chyby tím, že změní adresu URL vytvořenou odkazy z http://localhost:xxxx/Movies/Details/1 na 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 filmu s hodnotou null bude chyba databáze.

Delete Prozkoumejte metody aDeleteConfirmed.

// 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 HTTP Get``Delete metoda neodstraní zadané video, ale vrátí zobrazení videa, kam můžete odeslat (HttpPost) odstranění. Provedení operace odstranění v reakci na požadavek GET (nebo provedení operace úprav, operace vytvoření nebo jiné operace, která mění data) otevře bezpečnostní díru. Další informace o tom najdete v příspěvku na blogu Stephena Walthera ASP.NET tip MVC #46 – Nepoužívejte odstranit odkazy, protože vytvářejí bezpečnostní díry.

Metoda HttpPost , která odstraní data, má název DeleteConfirmed , aby metoda HTTP POST získala jedinečný podpis nebo název. Níže jsou uvedené dva signatury metody:

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

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

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í přijmout jedno celé číslo jako parametr.)

Abyste to vyřešili, můžete udělat několik věcí. Jedním z nich je dát metodám různé názvy. To udělal mechanismus generování uživatelského rozhraní v předchozím příkladu. To ale přináší malý problém: ASP.NET mapuje segmenty adresy URL na metody akcí podle názvu, a pokud metodu přejmenujete, směrování by normálně tuto metodu nenašlo. Řešení je to, co vidíte v příkladu, což je přidání atributu ActionName("Delete")DeleteConfirmed do metody. Tím se efektivně provede 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 problémů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řidávají typ FormCollection parametru, který se předá metodě POST, a pak 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");
}

Souhrn

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

Snímek obrazovky se stránkou Indexu vyhledávání filmů M V C

Další kroky

Po vytvoření a otestovaní webové aplikace je dalším krokem zpřístupnění webové aplikace jiným uživatelům, aby ji mohli používat přes internet. Chcete-li to provést, musíte ho nasadit u poskytovatele webového hostingu. Microsoft nabízí bezplatné hostování webů až pro 10 webů v bezplatném zkušebním účtu Windows Azure. Dále vám doporučujeme postupovat podle mého kurzu Nasazení zabezpečené aplikace ASP.NET MVC s členstvím, OAuth a SQL Database na web Windows Azure. Vynikajícím kurzem je Tom Dykstra na střední úrovni 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 mě na Twitteru, abyste získali aktuální informace o mých nejnovějších kurzech.

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

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