Tự động ánh xạ các tham số của action

Một phần của tài liệu Tạo ứng dụng ASP mvc (Trang 80 - 84)

Nền tảng ASP.NET MVC có thể tự động ánh xạ tham số từ URL đến các tham số của action. Khi bạn định nghĩa action có tham số, nền tảng MVC sẽ kiểm tra dữ liệu của request và sác định xem có giá trị nào trùng tên với các tham số không, nếu có thì sẽ lấy các giá trị đó để tuyền vào các tham số.

Ví dụ dưới đây sẽ không sử dụng Request[“id”] như ở phương thức ví dụ ở trên, thay vào đó, action sẽ được quy định tham số id một cách tường minh, và MVC sẽ tự động ánh xạ giá trị của

Request[“id”] vào tham số id:

public ResultAction Detail(int id) {

ViewData["DetailInfo"] = id; return View();

}

Bạn cũng có thể thêm tham số như là một phần của URL thay vì sử dụng các chuỗi truy vấn. Ví dụ, thay vì sử dụng /Products/Detail?id=3, bạn có thể sử dụng một URL có dạng /Products/Detail/3. Quy tắc ánh xạ tuyến mặc định có định dạng là /{controller}/{action}/{id}. Và lúc đó 3 sẽ là giá trị của tham

số id.

Ngoài ra bạn cũng có thể quy định kiểu chấp nhận giá trị (null-able type) để truyền các tham số có

thể không có giá trị được gởi lên như sau:

public ActionResult ShowArticles(DateTime? date) { if(!date.HasValue) { date = DateTime.Now; } // ... }

Ở ví dụ trên, nếu không có giá trị nào được truyền lên với tên là date, thì date sẽ được kiểm tra và

gán cho giá trị là ngày tháng hiện tại.

Như vậy, chúng ta đã cùng nhau tìm hiểu các kía cạnh cơ bản của action và các kiểu ActionResult cũng như về các truy xuất các giá trị được gởi lên ở request.

Hẹn gặp lại các bạn ở bài tiếp theo!

Cải tiến các phương thức Details và Delete

Bài viết được cập nhật từ 1:53:11 CH, 02 Tháng Mười 2012 bởi tumivn Chú ý: Hãy đăng nhập để download tập tin đính kèm!

Trong bài cuối cùng của chương một trong khóa học Làm quen với lập trình ASP.NET MVC, chúng ta sẽ cùng nhau cải tiến các phương thức Details và Delete được sinh ra bởi Visual Studio. Những thay đổi này tuy không bắt buộc, nhưng chỉ với một ít mã lệnh, bạn có thể dễ dàng cải tiến ứng dụng.

Cải thiện các phương thức Details và Delete

Khi bạn tạo TaskController, ASP.NET MVC đã tự động tạo ra các mã lệnh và chúng hoạt động rất tốt, tuy nhiên bạn vẫn cần cải thiện để cho chúng hoạt động hiệu quả hơn.

Bạn hãy mở mã cài đặt cho TaskController và thay đổi phương thức Details bằng cách trả về HttpNotFound khi không tìm thấy Task cần tìm. Bạn cũng có thể cập nhật phương thức Details để quy định giá trị mặt định của id được truyền vào cho action này. Tuy nhiên khi bạn trả về đối tượng HttpNotFound, bạn cần phải thay đổi kiểu trả về của action Details từ ViewResult thành ActionResult,

bởi HttpNotFound không kế thừa từ ViewResult.

public ActionResult Details(int id = 0) {

Task task = db.Tasks.Find(id); if(task == null) { return HttpNotFound(); } return View(task); }

Sau khi đã điều chỉnh action này, khi bạn muốn xem thông tin của một task có id không tồn tại, ứng dụng sẽ trả về mã 404 để báo rằng ứng dụng không tìm thấy tài nguyên mong muốn (ví dụ như truy

xuất /Task/Details/13343 chẳng hạn).

Đối với phương thức Delete, bạn cần lưu ý rằng phương thức này không được dùng để xóa dữ liệu, lý do là bạn không nên sử dụng các action đáp ứng GET Request để thay đổi dữ liệu, bởi nó sẽ tạo ra lổ hổng bảo mật (tôi sẽ có bài viết về điều này).

Phương thức DeleteConfirmed chỉ chấp nhận các POST request được cái đặt để xóa dữ liệu. Hai

phương thức Delete và DeleteConfirmed được

Visual Studio sinh ra như sau:

public ActionResult Delete(int id) {

Task task = db.Tasks.Find(id); return View(task);

} //

[HttpPost, ActionName("Delete")]

public ActionResult DeleteConfirmed(int id) {

Task task = db.Tasks.Find(id); db.Tasks.Remove(task);

db.SaveChanges();

return RedirectToAction("Index"); }

Tuy phương thức DeleteConfirmed có tên không phải là Delete, nhưng nó vẫn được ánh xạ với POST Request yêu cầu action Delete xử lý, đó là nhờ vào annotation [HttpPost, ActionName("Delete")]. Tuy nhiên, bạn vẫn có thể đặt tên trực tiếp cho phương thức DeleteConfirmed thành tên Delete chỉ bằng cách thêm vào tham số để cho số lượng tham số của phương thức này khác với phương thức Delete dùng để đáp ứng các GET request. Ví dụ như bạn có thể thêm vào tham số có kiểu là FormCollection,

và bạn không cần phải dùng nó.

[HttpPost]

public ActionResult Delete(FormCollection fcNotUsed,int id) {

Task task = db.Tasks.Find(id); if (task == null) { return HttpNotFound(); } db.Tasks.Remove(task); db.SaveChanges();

return RedirectToAction("Index"); }

Lời tổng kết cho chương 1

Như vậy bạn đã trải qua mười một bài viết của chương 1 khóa học Nhập môn lập trình ASP.NET MVC, và bạn đã tìm hiểu những nét sơ đẳng của ASP.NET MVC. Bạn cũng đã cùng tôi xây dựng một ứng dụng mẫu để tìm hiểu một số khía cạnh của ASP.NET MVC, đặc biệt là bạn đã nắm được phần nào về Model, View và Controller, hơn thế nữa, bạn còn làm quen với Entity Framework, một công cụ ORM giúp bạn dễ dàng truy xuất database và ứng dụng nó trong ứng dụng ASP.NET MVC.

Với chương II, bạn sẽ cùng chúng tôi tìm hiểu sâu hơn một chút về Entity Framework và cách sử

dụng của EF với ASP.NET MVC.

Hẹn gặp lại các bạn ở các bài sau của khóa học này!

Happy Coding!’

Tumi Le: "Đối với phương thức Delete, bạn cần lưu ý rằng phương thức này không được dùng để xóa dữ liệu, lý do là bạn không nên sử dụng các action đáp ứng GET Request để thay đổi dữ liệu, bởi nó

sẽ tạo ra lổ hổng bảo mật."

Trước đây tôi cũng đã viết một thắc mắc cho vấn đề này, có lẽ là tôi chưa hiểu rõ. Câu trả lời thì không quá phức tạp. Lấy ví dụ ở trên, giả sử tôi viết action Delete trong TaskController (với điều kiện chúng ta chưa nói đến check permission và chứng thực người dùng) như sau:

public ActionResult Delete(int id) {

Task task = db.Tasks.Find(id); db.Tasks.Remove(task);

db.SaveChanges();

return RedirectToAction("Index"); }

Như vậy mỗi lần tôi gọi GET request (cách làm đơn giản là copy url bên dưới vào address bar của

trình duyệt), ví dụ:

http://domain.com/task/delete/12 thì vô tình chúng ta lại xóa đi một task record với id = 12. Nguy hại hơn, tôi viết cho 1 vòng lặp từ 1-10.000 chẳng hạn, mỗi lần như vậy tôi gọi http://domain.com/task/delete/id (id = {1, 10.000}) thì chẳng khác nào xóa mọi record mà ta đã lưu

vào database.

Ngoài ra còn một lí do khác, các phương thức HTTP bao gồm: GET, POST, PUT, DELETE và một vài phương thức khác nữa. Nếu các bạn đã từng tìm hiểu về web api thì chắc là đã biết về nguyên lý thiết kế REST. Nguyên lí cơ bản này là thiết lập một ánh xạ 1-1 giữa các hành động tạo(POST), đọc(GET), cập nhật(PUT) và xóa (DELETE) (CRUD). Theo cách ánh xạ này thì:

- Để tạo một tài nguyên trên máy chủ, bạn cần sử dụng phương thức POST.

- Để truy xuất một tài nguyên, sử dụng GET.

- Để thay đổi trạng thái một tài nguyên hoặc để cập nhật nó, sử dụng PUT. - Để huỷ bỏ hoặc xoá một tài nguyên, sử dụng DELETE.

Đối với GET request thì không nên thay đổi trạng thái của ứng dụng. Nghĩa là chúng ta không nên tạo, cập nhật hay xóa dữ liệu đúng như cái tên gọi của nó, chúng ta nên sử dụng các phương thức HTTP một cách rõ ràng.

Một phần của tài liệu Tạo ứng dụng ASP mvc (Trang 80 - 84)

Tải bản đầy đủ (DOCX)

(84 trang)
w