Część 10. Badanie metod Szczegółów i Usuwanie aplikacji ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Autor: Rick Anderson
Otwórz kontroler Movie i sprawdź metodę Details
:
// 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, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies
kontrolerem, Details
metodą i wartością id
. Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1
na coś http://localhost:{PORT}/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.
Zbadaj Delete
metody i DeleteConfirmed
.
// 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);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Należy pamiętać, że HTTP GET Delete
metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda [HttpPost]
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
// 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ążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete
metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed
. Możesz to zrobić w tym miejscu dla [HttpPost] Delete
metody :
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.
Niezawodne wzorce aplikacji internetowej
for.NET Aby uzyskać wskazówki dotyczące tworzenia nowoczesnej, niezawodnej, wydajnej, ekonomicznej i skalowalnej aplikacji ASP.NET Core, zapoznaj się ze wskazówkami dotyczącymi tworzenia nowoczesnej, niezawodnej, wydajnej i skalowalnej aplikacji platformy ASP.NET Core, od podstaw lub refaktoryzacji istniejącej aplikacji.
Otwórz kontroler Movie i sprawdź metodę Details
:
// 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, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies
kontrolerem, Details
metodą i wartością id
. Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1
na coś http://localhost:{PORT}/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.
Zbadaj Delete
metody i DeleteConfirmed
.
// 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);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Należy pamiętać, że HTTP GET Delete
metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda [HttpPost]
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
// 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ążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete
metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed
. Możesz to zrobić w tym miejscu dla [HttpPost] Delete
metody :
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.
Niezawodne wzorce aplikacji internetowej
for.NET Aby uzyskać wskazówki dotyczące tworzenia nowoczesnej, niezawodnej, wydajnej, ekonomicznej i skalowalnej aplikacji ASP.NET Core, zapoznaj się ze wskazówkami dotyczącymi tworzenia nowoczesnej, niezawodnej, wydajnej i skalowalnej aplikacji platformy ASP.NET Core, od podstaw lub refaktoryzacji istniejącej aplikacji.
Otwórz kontroler Movie i sprawdź metodę Details
:
// 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, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies
kontrolerem, Details
metodą i wartością id
. Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1
na coś http://localhost:{PORT}/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.
Zbadaj Delete
metody i DeleteConfirmed
.
// 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);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Należy pamiętać, że HTTP GET Delete
metoda nie usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda [HttpPost]
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
// 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ążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete
metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed
. Możesz to zrobić w tym miejscu dla [HttpPost] Delete
metody :
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.
Otwórz kontroler Movie i sprawdź metodę Details
:
// 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, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies
kontrolerem, Details
metodą i wartością id
. Pamiętaj, że te segmenty są zdefiniowane w pliku Program.cs
.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1
na coś http://localhost:{PORT}/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.
Zbadaj Delete
metody i DeleteConfirmed
.
// 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 usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda [HttpPost]
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
// 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ążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete
metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed
. Możesz to zrobić w tym miejscu dla [HttpPost] Delete
metody :
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.
Otwórz kontroler Movie i sprawdź metodę Details
:
// 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, który utworzył tę metodę akcji, dodaje komentarz pokazujący żądanie HTTP, które wywołuje metodę. W takim przypadku jest to żądanie GET z trzema segmentami adresów URL, Movies
kontrolerem, Details
metodą i wartością id
. Pamiętaj, że te segmenty są zdefiniowane w pliku Startup.cs
.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Program EF ułatwia wyszukiwanie danych przy użyciu FirstOrDefaultAsync
metody . Ważną funkcją zabezpieczeń wbudowaną w metodę jest to, że kod sprawdza, czy metoda wyszukiwania znalazła film, zanim podejmie próbę wykonania niczego z nim. Na przykład haker może wprowadzić błędy w witrynie, zmieniając adres URL utworzony przez łącza z http://localhost:{PORT}/Movies/Details/1
na coś http://localhost:{PORT}/Movies/Details/12345
podobnego (lub inną wartość, która nie reprezentuje rzeczywistego filmu). Jeśli nie sprawdzisz filmu o wartości null, aplikacja zgłosi wyjątek.
Zbadaj Delete
metody i DeleteConfirmed
.
// 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 usuwa określonego filmu, zwraca widok filmu, w którym można przesłać (HttpPost) usunięcie. Wykonanie operacji usuwania w odpowiedzi na żądanie GET (lub w tym przypadku wykonanie operacji edycji, operacji tworzenia lub dowolnej innej operacji, która zmienia dane) otwiera dziurę zabezpieczeń.
Metoda [HttpPost]
, która usuwa dane, jest nazwana DeleteConfirmed
w celu nadania metodzie HTTP POST unikatowego podpisu lub nazwy. Poniżej przedstawiono dwa podpisy metody:
// 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ążonych metod, aby mieć unikatowy podpis parametru (taką samą nazwę metody, ale inną listę parametrów). Jednak w tym miejscu potrzebne są dwie Delete
metody — jedna dla metody GET i jedna dla funkcji POST — które mają ten sam podpis parametru. (Oba elementy muszą zaakceptować pojedynczą liczbę całkowitą jako parametr).
Istnieją dwa podejścia do tego problemu, jednym z nich jest nadanie metodom różnych nazw. Tak właśnie zrobił mechanizm tworzenia szkieletów w poprzednim przykładzie. Jednak w ten sposób wprowadzono niewielki problem: ASP.NET mapuje segmenty adresu URL na metody akcji według nazwy, a jeśli zmienisz nazwę metody, routing zwykle nie będzie mógł znaleźć tej metody. Rozwiązaniem jest to, co widać w przykładzie, czyli dodanie atrybutu ActionName("Delete")
DeleteConfirmed
do metody . Ten atrybut wykonuje mapowanie dla systemu routingu, tak aby adres URL zawierający /Delete/ dla żądania POST znaleźć metodę DeleteConfirmed
.
Innym typowym rozwiązaniem w przypadku metod, które mają identyczne nazwy i podpisy, jest sztuczna zmiana podpisu metody POST w celu uwzględnienia dodatkowego (nieużywanego) parametru. To właśnie zrobiliśmy w poprzednim wpisie po dodaniu parametru notUsed
. Możesz to zrobić w tym miejscu dla [HttpPost] Delete
metody :
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Publikowanie na platformie Azure
Aby uzyskać informacje na temat wdrażania na platformie Azure, zobacz Samouczek: tworzenie aplikacji ASP.NET Core i SQL Database w usłudze aplikacja systemu Azure Service.