Sprawdź szczegóły i usunięcie metod aplikacji ASP.NET CoreExamine the Details and Delete methods of an ASP.NET Core app

Przez Rick AndersonBy Rick Anderson

Otwórz kontrolera film i zbadaj Details metody:Open the Movie controller and examine the Details method:

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

Aparat tworzenia szkieletów MVC, utworzony z tą metodą akcji dodaje komentarz przedstawiający żądanie HTTP, który wywołuje tę metodę.The MVC scaffolding engine that created this action method adds a comment showing an HTTP request that invokes the method. W tym przypadku jest żądanie GET z trzech segmenty adresu URL, Movies kontrolera, Details metody i id wartość.In this case it's a GET request with three URL segments, the Movies controller, the Details method, and an id value. Te segmenty są definiowane w odwołania Startup.cs.Recall these segments are defined in Startup.cs.

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync metody.EF makes it easy to search for data using the FirstOrDefaultAsync method. Ważna funkcja zabezpieczeń wbudowanych w metodzie jest kod sprawdza, ta metoda wyszukiwania wykryła filmu przed ponowną próbą podejmować żadnych działań z nim.An important security feature built into the method is that the code verifies that the search method has found a movie before it tries to do anything with it. Na przykład haker może spowodować błędy do witryny, zmieniając adres URL utworzony przez łącza z http://localhost:xxxx/Movies/Details/1 na wartość podobną http://localhost:xxxx/Movies/Details/12345 (lub inną wartość, która nie zawiera rzeczywistych filmu).For example, a hacker could introduce errors into the site by changing the URL created by the links from http://localhost:xxxx/Movies/Details/1 to something like http://localhost:xxxx/Movies/Details/12345 (or some other value that doesn't represent an actual movie). Jeśli zaznaczono film o wartości null aplikacji będzie zgłaszają wyjątek.If you didn't check for a null movie, the app would throw an exception.

Sprawdź Delete i DeleteConfirmed metody.Examine the Delete and DeleteConfirmed methods.

// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    var movie = await _context.Movie.FindAsync(id);
    _context.Movie.Remove(movie);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

Należy pamiętać, że HTTP GET Delete metoda nie powoduje usunięcia określonego filmu, zwraca widok filmu dokąd wysyłać (HttpPost) usuwania.Note that the HTTP GET Delete method doesn't delete the specified movie, it returns a view of the movie where you can submit (HttpPost) the deletion. Wykonywanie operacji usuwania w odpowiedzi na polecenie GET żądania (lub służącego wykonywania operacji Edytuj, Utwórz operacji lub innej operacji, które zmieniają dane) otwiera lukę w zabezpieczeniach.Performing a delete operation in response to a GET request (or for that matter, performing an edit operation, create operation, or any other operation that changes data) opens up a security hole.

[HttpPost] Nosi nazwę metody, która powoduje usunięcie danych DeleteConfirmed zapewnienie metodą HTTP POST unikatowy podpis lub nazwy.The [HttpPost] method that deletes the data is named DeleteConfirmed to give the HTTP POST method a unique signature or name. Poniżej przedstawiono podpisy dwóch metod:The two method signatures are shown below:

// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{

Środowisko uruchomieniowe języka wspólnego (CLR) wymaga przeciążonej metody ma unikatowy parametr podpisu (tej samej nazwie metoda, ale inną listę parametrów).The common language runtime (CLR) requires overloaded methods to have a unique parameter signature (same method name but different list of parameters). Jednak w tym miejscu należy dwa Delete metody — jeden dla GET--i jeden dla wpisu, czy obie pozycje mają taki sam podpis parametru.However, here you need two Delete methods -- one for GET and one for POST -- that both have the same parameter signature. (Obaj użytkownicy muszą zaakceptować pojedyncze liczby całkowite jako parametr.)(They both need to accept a single integer as a parameter.)

Dostępne są dwie opcje tego problemu, jednym jest nadać różne nazwy metody.There are two approaches to this problem, one is to give the methods different names. To mechanizm tworzenia szkieletów została w poprzednim przykładzie.That's what the scaffolding mechanism did in the preceding example. Jednak wprowadza mały problem: ASP.NET mapuje segmentów adresu URL do metody akcji według nazwy, a jeśli zmienisz metodę, routing zwykle nie można znaleźć tej metody.However, this introduces a small problem: ASP.NET maps segments of a URL to action methods by name, and if you rename a method, routing normally wouldn't be able to find that method. Rozwiązanie jest widoczny w tym przykładzie jest dodanie ActionName("Delete") atrybutu DeleteConfirmed metody.The solution is what you see in the example, which is to add the ActionName("Delete") attribute to the DeleteConfirmed method. Ten atrybut wykonuje mapowanie systemu routingu, aby znaleźć adres URL, który zawiera /Delete/ dla żądania POST DeleteConfirmed metody.That attribute performs mapping for the routing system so that a URL that includes /Delete/ for a POST request will find the DeleteConfirmed method.

Inny wspólnej obejście dla metod, które mają identyczne nazwy i wzory podpisów jest sztucznie Zmień podpis metody POST w celu uwzględnienia dodatkowych parametrów (nieużywane).Another common work around for methods that have identical names and signatures is to artificially change the signature of the POST method to include an extra (unused) parameter. To, co zrobiliśmy w poprzednim wpisie podczas dodaliśmy notUsed parametru.That's what we did in a previous post when we added the notUsed parameter. Możesz to zrobić to samo w tym miejscu dla [HttpPost] Delete metody:You could do the same thing here for the [HttpPost] Delete method:

// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

Publikowanie na platformie AzurePublish to Azure

Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz samouczka: Tworzenie aplikacji internetowej platformy .NET Core i SQL Database w usłudze Azure App Service.For information on deploying to Azure, see Tutorial: Build a .NET Core and SQL Database web app in Azure App Service.