Phần 10: Kiểm tra các method Details và Delete của ứng dụng ASP.NET Core
Mở Movie controller và kiểm tra method 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);
}MVC scaffolding engine (công cụ tạo mã tự động) tạo ra action method này thêm một comment hiển thị một HTTP request gọi method. Trong trường hợp này là một GET request với ba phân đoạn URL: controller Movies, method Details, và giá trị id. Nhớ lại các phân đoạn này được định nghĩa trong Program.cs.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");EF giúp dễ dàng tìm kiếm dữ liệu bằng method FirstOrDefaultAsync. Một tính năng bảo mật quan trọng được tích hợp vào method là code xác minh rằng method tìm kiếm đã tìm thấy một bộ phim trước khi nó cố gắng làm bất cứ điều gì với nó. Ví dụ, một hacker có thể đưa lỗi vào site bằng cách thay đổi URL được tạo bởi các link từ http://localhost:{PORT}/Movies/Details/1 thành một cái gì đó như http://localhost:{PORT}/Movies/Details/12345 (hoặc một số giá trị khác không đại diện cho một bộ phim thực tế). Nếu bạn không kiểm tra cho movie null, ứng dụng sẽ ném ra một ngoại lệ.
Kiểm tra các method Delete và 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));
}Lưu ý rằng method HTTP GET Delete không xóa bộ phim được chỉ định, nó trả về một view của bộ phim nơi bạn có thể submit (HttpPost) việc xóa. Thực hiện thao tác xóa trong phản hồi với một GET request (hay thực hiện một thao tác edit, tạo, hoặc bất kỳ thao tác nào khác thay đổi dữ liệu) mở ra một lỗ hổng bảo mật.
Method [HttpPost] xóa dữ liệu được đặt tên là DeleteConfirmed để cung cấp cho method HTTP POST một signature (chữ ký) hoặc tên duy nhất. Hai chữ ký method được hiển thị dưới đây:
// 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)
{CLR (Common Language Runtime - Môi trường runtime ngôn ngữ chung) yêu cầu các method nạp chồng có signature tham số duy nhất (cùng tên method nhưng danh sách tham số khác nhau). Tuy nhiên, ở đây bạn cần hai method Delete -- một cho GET và một cho POST -- cả hai đều có signature tham số giống nhau. (Cả hai đều cần chấp nhận một số nguyên đơn lẻ làm tham số.)
Có hai cách tiếp cận cho vấn đề này, một là đặt cho các method tên khác nhau. Đó là những gì cơ chế scaffolding đã làm trong ví dụ trước. Tuy nhiên, điều này đưa ra một vấn đề nhỏ: ASP.NET ánh xạ các phân đoạn của URL đến các action method theo tên, và nếu bạn đổi tên một method, routing thường sẽ không tìm được method đó. Giải pháp là những gì bạn thấy trong ví dụ, đó là thêm thuộc tính ActionName("Delete") vào method DeleteConfirmed. Thuộc tính đó thực hiện mapping (ánh xạ) cho hệ thống routing sao cho một URL bao gồm /Delete/ cho một POST request sẽ tìm thấy method DeleteConfirmed.
Một cách giải quyết phổ biến khác cho các method có tên và signature giống hệt nhau là thay đổi nhân tạo signature của method POST để bao gồm một tham số (không được sử dụng) thêm. Đó là những gì chúng ta đã làm trong một bài đăng trước khi chúng ta thêm tham số notUsed. Bạn có thể làm tương tự ở đây cho method [HttpPost] Delete:
// POST: Movies/Delete/6 [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id, bool notUsed)
Publish lên Azure
Để biết thông tin về triển khai lên Azure, xem Tutorial: Build an ASP.NET Core and SQL Database app in Azure App Service.
Mẫu ứng dụng web doanh nghiệp
Để có hướng dẫn về việc tạo một ứng dụng ASP.NET Core đáng tin cậy, an toàn, hiệu suất cao, có thể kiểm tra và mở rộng được, xem Enterprise web app patterns. Một ứng dụng web mẫu chất lượng sản xuất hoàn chỉnh thực hiện các mẫu có sẵn.