2009-08-05 58 views
11

Với việc thêm MVC 2 của HtmlHelper EditorFor(), bạn không thể tạo các mẫu Hiển thị và Biên tập mạnh mẽ cho một đối tượng Mô hình cụ thể và sau khi không sử dụng nó có một chút bối rối về cách chuyển dữ liệu Mô hình bổ sung vào trình chỉnh sửa mà không làm mất khả năng gõ mạnh mẽ của điều khiển trình chỉnh sửa.ASP.NET MVC 2 - HTML.EditorFor() và Custom EditorTemplates

Ví dụ cổ điển: Sản phẩm có Danh mục. ProductEditor có một DropDownList cho Category chứa tên của tất cả các Category. ProductEditor được nhập mạnh vào Sản phẩm và chúng tôi cần phải chuyển vào Danh mục lựa chọn của Danh mục cũng như Sản phẩm.

Với chế độ xem chuẩn, chúng tôi sẽ bao bọc dữ liệu Mô hình theo một loại mới và truyền dữ liệu đó theo. Với EditorTemplate chúng ta mất một số chức năng tiêu chuẩn nếu chúng ta truyền vào một Mô hình hỗn hợp chứa nhiều đối tượng (điều đầu tiên tôi nhận thấy là tất cả các phương thức LabelFor/TextBoxFor đã tạo ra các tên thực thể như "Model.Object" thay vì chỉ "Object ").

Tôi làm sai hay nên Html.EditorFor() có tham số ViewDataDictionary/Model bổ sung?

Trả lời

13

Bạn có thể tạo một ViewModel trong đó có cả hai tính chất HOẶC bạn sẽ cần phải sử dụng ViewData để vượt qua mà thông tin trong tùy chỉnh.

+2

Đương nhiên điều này có ý nghĩa nhưng tôi không thể giúp đỡ, nhưng nhận thấy rằng việc đặt mô hình trong một tùy chỉnh ViewModel gây tên trường mẫu để có tiền tố là tên thuộc tính của đối tượng trong phong tục ViewModel. Không phải đây là vấn đề nhưng nó thêm một bước khác để cập nhật mô hình. Tôi có lẽ đang rên rỉ không cần thiết hả? –

5

tôi vẫn đang học, nhưng tôi đã có một vấn đề tương tự mà tôi làm việc ra một dung dịch. Danh mục của tôi là một enum và tôi sử dụng một điều khiển mẫu kiểm tra enum để xác định nội dung cho thẻ Chọn.

Nó được sử dụng trong giao diện như sau:

<%= Html.DropDownList 
      (
      "CategoryCode", 
      MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem) 
      ) %> 

Các enum cho loại được trang trí với Mô tả các thuộc tính được sử dụng như các giá trị văn bản trong mục Select:

public enum Category 
     { 
      [Description("Operative")] 
      Operative=1, 
      [Description("Non Operative")] 
      NonOperative=2, 
      [Description("Therapeutic")] 
      Therapeutic=3 
     } 
     private Category _CategoryCode; 
     public Category CategoryCode 
     { 
      get { return _CategoryCode; } 
      set { _CategoryCode = value; } 
     } 

Các cấu trúc SelectListForEnum danh sách các mục được chọn bằng cách sử dụng định nghĩa enum và chỉ mục cho mục hiện được chọn, như sau:

 public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem) 
    { 
     var enumValues = typeOfEnum.GetEnumValues(); 
     var enumNames = typeOfEnum.GetEnumNames(); 
     var count = enumNames.Length; 
     var enumDescriptions = new string[count]; 
     int i = 0; 
     foreach (var item in enumValues) 
     { 
      var name = enumNames[i].Trim(); 
      var fieldInfo = item.GetType().GetField(name); 
      var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 
      enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name; 
      i++; 
     } 
     var list = new SelectListItem[count]; 
     for (int index = 0; index < list.Length; index++) 
     { 
      list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) }; 
     } 
     return list; 
    } 

Kết quả cuối cùng là DDL được trình bày độc đáo.

Hy vọng điều này sẽ hữu ích. Bất kỳ ý kiến ​​về cách tốt hơn để làm điều này sẽ được đánh giá rất nhiều.

Các vấn đề liên quan