1. Trang chủ
  2. » Tất cả

24.Chuong 24

38 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 38
Dung lượng 1,66 MB

Nội dung

Chương 24 Model Binding Model binding trình việc tạo đối tượng NET sử dụng liệu gửi trình duyệt yêu cầu HTTP Tơi dựa vào quy trình model binding lần tơi định nghĩa phương thức action có tham số Tham số phương thức action tạo thông qua model binding từ liệu yêu cầu Trong chương này, cho bạn thấy cách hệ thống model binding làm việc minh họa kỹ thuật cần thiết để tùy chỉnh để khai thác nhiều lợi ích sử dụng Table 24-1: tóm tắt nội dung chương Chuẩn bị Project minh họa Tôi tạo project Visual Studio gọi MvcModels không sử dụng template lựa chọn tùy chọn để bao gồm thư mục core MVC references Tôi sử dụng lớp model mà bạn thấy chương trước, tạo tập tin lớp gọi Person.cs thư mục Models đảm bảo nội dung phù hợp với Bảng listing 24-1 Listing 24-1 Nội dung tập tin the Person.cs using System; namespace MvcModels.Models { public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public Address HomeAddress { get; set; } public bool IsApproved { get; set; } public Role Role { get; set; } } public class Address { public string Line1 { get; set; } public string Line2 { get; set; } public string City { get; set; } public string PostalCode { get; set; } public string Country { get; set; } } public enum Role { Admin, User, Guest } } Tôi định nghĩa controller Home, Listing 24-2 Controller định nghĩa tập hợp đối tượng Person mẫu định nghĩa hành động Index, cho phép để chọn người giá trị thực tính PersonId Listing 24-2 Nội dung tập tin HomeController.cs using System.Linq; using System.Web.Mvc; using MvcModels.Models; namespace MvcModels.Controllers { public class HomeController : Controller { private Person[] personData = { new Person {PersonId = 1, FirstName = "Adam", LastName = "Freeman", Role = Role.Admin}, new Person {PersonId = 2, FirstName = "Jacqui", LastName = "Griffyth", Role = Role.User}, new Person {PersonId = 3, FirstName = "John", LastName = "Smith", Role = Role.User}, new Person {PersonId = 4, FirstName = "Anne", LastName = "Jones", Role = Role.Guest} }; public ActionResult Index(int id) { Person dataItem = personData.Where(p => p.PersonId == id).First(); return View(dataItem); } } } Tôi tạo tập tin View /Views/Home/Index.cshtml để hỗ trợ phương thức action Bạn xem nội dung tập tin Listing 24-3 Tôi sử dụng mẫu @Html.DisplayFor để hiển thị số giá trị thuộc tính view model Person Listing 24-3 Nội dung tập tin /Views/Home/Index.cshtml @model MvcModels.Models.Person @{ ViewBag.Title = "Index"; Layout = "¡«/Views/Shared/_Layout.cshtml"; }< h2>Person ID:@Html.DisplayFor(m => m.PersonId) First Name:@Html.DisplayFor(m => m.FirstName) Last Name:@Html.DisplayFor(m => m.LastName) Role:@Html.DisplayFor(m => m.Role) Cuối cùng, tạo thư mục Views /Shared thêm layout gọi _Layout.cshtml, nội dung nhìn thấy Listing 24-4 Listing 24-4 Nội dung tập tin _Layout.cshtml @ViewBag.Title label { display: inline-block; width: 100px; font-weight: bold; margin: 5px; } form label { float: left; } input.text-box { float: left; margin: 5px; } button[type=submit] { margin-top: 5px; float: left; clear: left; } form div { clear: both; } @RenderBody() Hiểu Model Binding Model binding cầu nối tao nhã yêu cầu HTTP phương pháp C # mà định nghĩa action Hầu hết ứng dụng MVC Framework dựa vào mô hình liên kết với chừng mực đó, bao gồm ứng dụng ví dụ đơn giản mà tơi tạo phần trước Để xem model binding làm việc, khởi động ứng dụng điều hướng đến / Home / Index / Kết minh họa hình 24-1 URL giá trị thuộc tính PersonId đối tượng Person mà tơi muốn xem: /Home/Index/1 MVC Framework biên dịch phần URL sử dụng đối số gọi phương thức Index lớp controller home để phục vụ yêu cầu public ActionResult Index(int id) { Quá trình mà phân đoạn URL chuyển đổi thành tham số int phương thức ví dụ model binding Trong phần tiếp theo, cho bạn trình mà minh họa đơn giản khởi tạo, sau chuyển sang giải thích số model binding tính phức tạp Q trình dẫn đến model binding bắt đầu yêu cầu nhận xử lý công cụ định tuyến Tôi khơng thay đổi cấu hình định tuyến cho ứng dụng ví dụ, dịnh tuyến mặc định mà Visual Studio thêm vào tập tin /App_Start/RouteConfig.cs sử dụng để xử lý yêu cầu Như lời nhắc nhở, bạn xem tuyến đường mặc định Listing 24-5 Listing 24-5 Nội dung tập tin RouteConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcModels { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } } Tôi mô tả cách tuyến đường định nghĩa cách thức hoạt động chi tiết Chương 15 16, tơi khơng lặp lại thơng tin Đối với q trình model binding , phần quan trọng biến phân đoạn tùy chọn id Khi chuyển đến / Home / Index / URL, đoạn cuối URL, xác định đối tượng người mà tơi muốn lấy thông tin, gán cho biến id định tuyến The Invoker action, mà giới thiệu chương 17, sử dụng thơng tin định tuyến để tìm phương thức action Index yêu cầu để phục vụ u cầu, khơng thể gọi phương thức Index có giá trị cho đối số phương thức The Invoker action mặc định, ControllerActionInvoker, (được giới thiệu chương 17), dựa vào model bindersh để tạo đối tượng liệu yêu cầu để gọi action Model binders xác định interface IModelBinder, thể Listing 24-6 Tôi trở lại với giao diện sau chương cho bạn cách để tạo mmodel binders tùy chỉnh Listing 24-6 Interface IModelBinder MVC Framework namespace System.Web.Mvc { public interface IModelBinder { object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext); } } Có thể có nhiều model binders ứng dụng MVC, model binders chịu trách nhiệm ràng buộc nhiều loại model Khi invoker action cần gọi phương thức action, xem xét thơng số mà phương thức định nghĩa tìm kiếm model binders chịu trách nhiệm cho loại Ví dụ phần này, invoker hành động kiểm tra phương thức Index thấy có tham số int Sau xác định vị trí binder chịu trách nhiệm giá trị int gọi phương thức BindModel Các model binder chịu trách nhiệm cung cấp giá trị int sử dụng để gọi phương thức Index Điều thường có nghĩa chuyển đổi số phần tử liệu yêu cầu (như form giá trị chuỗi truy vấn), MVC Framework không đặt giới hạn thu thập liệu Tơi cho bạn số ví dụ tùy chỉnh binder chương Tôi giới thiệu bạn số tính lớp ModelBindingContext, truyền cho phương thức IModelBinder.BindModel Sử dụng Model Binder mặc định Mặc dù ứng dụng định nghĩa model binders tùy chỉnh, hầu hết dựa vào tích hợp lớp binder, DefaultModelBinder Đây binder sử dụng invoker action khơng thể tìm thấy binder tùy chỉnh để ràng buộc dạng Theo mặc định, mơ hình bìa tìm kiếm bốn địa điểm, thể Bảng 24-2, cho liệu phù hợp với tên tham số bị ràng buộc Table 24-2 Thứ tự mà lớp DefaultModelBinder tìm kiếm liệu đối số Các vị trí tìm Ví dụ, ví dụ đơn giản tơi, DefaultModelBinder tìm kiếm giá trị cho tham số id sau: Request.Form["id"] RouteData.Values["id"] Request.QueryString["id"] Request.Files["id"] Việc tìm kiếm ngừng lại giá trị tìm thấy Trong ví dụ, form khơng tìm kiếm hồn tồn biến định tuyết tìm thấy với định danh Điều có nghĩa chuỗi truy vấn tên tập tin tải lên hồn tồn khơng tìm Tip: Khi dựa model binder mặc định, điều quan trọng tham số cho phương thức action bạn khớp với thuộc tính liệu bạn tìm kiếm Ứng dụng ví dụ tơi hoạt động tên tham số phương thức action tương ứng với tên biến định tuyến Nếu đặt tên cho tham số phương thức action PersonId, model binder mặc định định vị giá trị liệu phù hợp yêu cầu thất bại Ràng buộc kiểu đơn giản Khi xử lý với loại tham số đơn giản, DefaultModelBinder tìm cách để chuyển đổi chuỗi giá trị thu từ liệu yêu cầu thành kiểu tham số sử dụng lớp System.ComponentModel.TypeDescriptor Nếu giá trị chuyển đổi (chẳng hạn như, cung cấp giá trị kiểu chuỗi apple cho tham số mà đòi hỏi giá trị int), DefaultModelBinder khơng thể liên kết với model Bạn thấy vấn đề mà việc gây cách khởi động ứng dụng ví dụ điều hướng đến URL / Home / Index / apple Hình 24-2 minh họa phản hồi từ máy chủ Model binder mặc định binder cứng đầu Nó thấy giá trị int cần thiết cố gắng để chuyển đổi giá trị mà cung cấp URL, apple, thành kiểu int, mà nguyên nhân lỗi hiển thị hình Tơi làm cho việc dễ dàng cho model binder cách sử dụng loại nullable, để cung cấp cho model binder phương án dự phịng Bạn thấy cách tơi áp dụng loại nullable vào action Index Listing 24-7 Listing 24-7 Nội dung tập tin HomeController.cs public ActionResult Index(int? id) { Person dataItem = personData.Where(p => p.PersonId == id).First(); return View(dataItem); } Nếu bạn khởi động lại ứng dụng điều hướng tới /Home/Index/apple bạn thấy thay đổi thay giải vấ để: Bất kể lúc model binder khơng thể tìm giá trị phù hợp cho tham số id, giá trị mặc định sử dụng thay vào Do chọn đối tượng Person có giá trị personID Tip: Lưu ý giải vấn đề giá trị khơng phải số cho mơ hình chất kết dính, mà tơi lấy giá trị int mà khơng có đối tượng Person hợp lệ định nghĩa controller Home Chẳng hạn, model binder vui vẻ chuyển đổi phân đoạn cuối URL / Home / Index / -1 / Home / Index / 500 thành giá trị int Điều cho phép phương thức action gọi phương thức Index với giá trị thực, dẫn đến lỗi tơi khơng thực kiểm tra bổ sung controller Tôi khuyên bạn nên ý đến phạm vi giá trị tham số phương thức action bạn nhận kiểm nghiệm thích hợp CÚ PHÁP CHUYỂN ĐỔI VÙNG MIỀN NHẠY CẢM Lớp DefaultModelBinder sử dụng cài đặt đặc tả vùng miền để thực chuyển đổi kiểu từ phần khác liệu request Các giá trị thu thập từ URL (bao gồm định tuyến liệu chuỗi truy vấn) chuyển đổi sử dụng chế độ chuyển đổi culture-insensitive giá trị từ liệu form chuyển đổi sử dụng chế độ culture into account Vấn đề phổ biến mà điều gây liên quan đến giá trị DateTime Giá trị ngày Culture-insensitive kỳ vọng định dạng phổ biến: yyyy-mm-dd Giá trị ngày Form kỳ vọng định dạng theo định máy chủ Điều có nghĩa máy chủ cài đặt với văn hóa Anh kỳ vọng ngày định dạng dd- }< h2>Names @if (Model.Count == 0) { using (Html.BeginForm()) { for (int i = 0; i < 3; i++) { @(i + 1):@Html.TextBox("names") } Submit } } else { foreach (string str in Model) {

@str

} @Html.ActionLink("Back", "Names"); } Tính action Names khơng đổi tơi làm việc với collection thay mảng Ràng buộc Collection kiểu Model tùy chỉnh Tôi ràng buộc riêng thuộc tính dự liệu vào mảng tùy chọn liệu, lớp model AddressSummary Trong Listing 24-25, bạn thấy tơi thêm vào mội phương thức action vào controller Home gọi Address có tham số kiểu collection dựa vào lớp model tùy chỉnh Listing 24-25 Nội dung tập tin HomeController.cs using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using MvcModels.Models; namespace MvcModels.Controllers { public class HomeController : Controller { // other methods and statements omitted for brevity public ActionResult Address(IList addresses) { addresses = addresses ?? new List(); return View(addresses); } } } View mà tạo cho phương thức action /Views/Home/Address.cshtml, bạn thấy Listing 24-26 Listing 24-26 Nội dung tập tin Address.cshtml tập tin @using MvcModels.Models @model IList @{ ViewBag.Title = "Address"; Layout = "∼/Views/Shared/_Layout.cshtml"; }< h2>Addresses @if (Model.Count() == 0) { using (Html.BeginForm()) { for (int i = 0; i < 3; i++) { Address @(i + 1) City:@Html.Editor("[" + i + "].City") Country:@Html.Editor("[" + i + "].Country") } Submit } } else { foreach (AddressSummary str in Model) {

@str.City, @str.Country

} @Html.ActionLink("Back", "Address"); } View trả vể khơng có item model collection Form bao gồm cặp thuộc tính mơ tả name prefixed với số mảng sau: Address 1 City: Country: Address 2 City: ... thực thi concrete( dù tơi tơi thích) Trong Listing 24- 24, bạn thấy cách tơi chỉnh sửa tập tin view Names.cshtml để sử dụng kiểu model Listing 24- 24 Nội dung tập tin Names.cshtml @model IList... phương thức action Bạn xem nội dung tập tin Listing 24- 3 Tôi sử dụng mẫu @Html.DisplayFor để hiển thị số giá trị thuộc tính view model Person Listing 24- 3 Nội dung tập tin /Views/Home/Index.cshtml... cùng, tạo thư mục Views /Shared thêm layout gọi _Layout.cshtml, nội dung nhìn thấy Listing 24- 4 Listing 24- 4 Nội dung tập tin _Layout.cshtml

Ngày đăng: 23/10/2019, 21:15