2011-11-18 33 views
39

Có vẻ lạ khi tôi không thể tìm thấy lời giải thích về sự khác biệt giữa hai người giúp đỡ đó, vì vậy tôi cho rằng đó là điều hiển nhiên nhưng tôi đã bỏ lỡ.Sự khác biệt giữa DropDownlist hoặc DropDownListFor Html helper

Về cơ bản tôi đang cố gắng để quyết định cái nào tôi nên sử dụng cho trường hợp của tôi, với sự đơn giản Mẫu sau:

public class Booking 
    { 
     public int ID { get; set; } 
     public Room Room { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; } 
     public ICollection<Equipment> Equipments { get; set; } 
     public string Who { get; set; } 
    } 

và tôi muốn hiển thị một DropDownList đơn giản Phòng cho Thêm và kỷ lục Editing đặt phòng.

Sau khi thực hiện rất nhiều Google xung quanh, có vẻ như tôi có thể cần một DropDopwListFor, nhưng không chắc chắn tại sao và như thế nào?

+0

Cảm ơn các ví dụ tốt, có ý nghĩa và câu hỏi của tôi tầm thường: D. Nhưng tại sao tất cả mọi người cho tôi một ví dụ về Dropdownlist cho thiết bị, nhưng tôi yêu cầu một ví dụ làm việc của phòng, nhưng tôi cho rằng họ sẽ làm việc khá giống như vậy? –

Trả lời

76

Lấy hai ví dụ sau đây:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

và:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

Rõ ràng là với ví dụ thứ hai tên của thuộc tính bạn đang ràng buộc thả xuống để được hardcoded như một ma thuật chuỗi.Điều này có nghĩa là nếu bạn quyết định tái cấu trúc mô hình của mình và đổi tên thuộc tính này, công cụ hỗ trợ mà bạn có thể đang sử dụng không có cách nào để phát hiện thay đổi này và tự động sửa đổi chuỗi ma thuật mà bạn đã mã hóa cứng thành nhiều khả năng. Vì vậy, bạn sẽ phải tự tìm kiếm & thay thế ở mọi nơi mà trình trợ giúp đánh máy yếu này được sử dụng. Với ví dụ đầu tiên, chúng tôi đang sử dụng một biểu thức lambda được đánh mạnh mẽ gắn với thuộc tính mô hình đã cho để các công cụ có thể tự động đổi tên nó ở mọi nơi được sử dụng nếu bạn quyết định tái cấu trúc mã của mình. Ngoài ra nếu bạn quyết định biên dịch trước các khung nhìn của mình, bạn sẽ nhận được một lỗi thời gian biên dịch ngay lập tức trỏ đến khung nhìn cần được sửa. Với ví dụ thứ hai, bạn (lý tưởng) hoặc người dùng trang web của bạn (trường hợp xấu nhất) sẽ gặp phải lỗi thời gian chạy khi họ truy cập vào chế độ xem cụ thể này.

Người hỗ trợ gõ mạnh mẽ lần đầu tiên được giới thiệu trong ASP.NET MVC 2 và lần cuối cùng tôi sử dụng trình trợ giúp đã gõ yếu trong ứng dụng ASP.NET MVC 1 từ lâu.

+0

Ví dụ tuyệt vời :) – kbvishnu

+0

Cập nhật cho V6 - bạn rõ ràng có thể bỏ qua chuỗi ma thuật bằng cách sử dụng từ khóa nameof mới (nameof (x.EquipmentId) mà kết quả là trong DeviceId. – TomTom

5

DropDownListFor sẽ tự động chọn giá trị được lựa chọn bằng cách sử dụng các tài sản quy định:

// Will select the item in model.Equipments that matches Model.EquipmentId 
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

Một bình luận:

Đừng có ICollection<Equipment> Equipments trong mô hình quan điểm của bạn. Bạn phải có thuộc tính trả về một số IEnumerable<SelectListItem>.

+0

Cảm ơn bạn đã giúp tôi. Nhưng tôi thực sự yêu cầu danh sách thả xuống Phòng, chỉ cần cố gắng để có được ý tưởng. Ngoài ra, không hiểu ví dụ của bạn trong mã xem về DropdownListFor cho thiết bị. Có vẻ như bạn gợi ý rằng tôi thêm một ViewModel trả về một IEnumberable trong ViewModel của tôi và trả về từ điều khiển để xem của tôi thay vì mô hình Đặt chỗ? Bạn có thể vui lòng cung cấp một ví dụ làm việc hoàn toàn dựa trên mô hình của tôi hoặc mô hình tốt hơn không? Tôi bị mắc kẹt bởi vì tôi không thể tìm thấy một ví dụ làm việc mà tôi có thể phù hợp với mô hình của tôi. –

2

Khi bạn muốn thêm một cái nhìn (aspx tập tin), nơi DropDownList này hoặc DropDownListFor sẽ được bên trong, rightclick-> thêm điểm sau đó chọn "Tạo một cái nhìn mạnh mẽ gõ" sau đó trong danh sách chọn Booking lớp. Sau đó thêm trang này.

Bạn có thể viết ở trong đó như sau:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments); 

vì chúng ta thêm mạnh mẽ gõ xem như Booking, bạn có thể có:

m => m.ID, m => m.Room, m => m.StartTime 

... vv

Trong của bạn các dịch vụ bạn có thể có các phương thức lấy dữ liệu từ cơ sở dữ liệu, sau đó sử dụng phương thức của dịch vụ này trong bộ điều khiển của bạn để truyền dữ liệu từ cơ sở dữ liệu để xem. Bạn có thể sử dụng ViewData trong điều khiển của bạn:

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable(); 

Đưa AsEnumarable() vào cuối danh sách của bạn lấy từ cơ sở dữ liệu làm cho nó IEnumarable.

Sau đó, theo quan điểm của bạn, bạn cũng có thể có:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]); 

Một liên kết vào cách sử dụng ViewData: http://msdn.microsoft.com/en-us/library/dd410596.aspx

Tôi hy vọng rằng sẽ giúp bạn.

+0

liên kết trong câu trả lời của bạn đã chết – dakait

+0

Tôi tin rằng ViewData đã được thay thế bằng ViewBag trong MVC 3: http://weblogs.asp.net/scottgu/announcing-asp-net-mvc-3-release-candidate-2 ViewBag đã mạnh mẽ các thuộc tính -typed trái ngược với các chuỗi được sử dụng trong ViewData. Đó là lý do tương tự cho lý do tại sao chúng ta nên sử dụng DropDownListFor hơn là DropDownList. –

2

DropdownListFor hỗ trợ loại mạnh và tên được chỉ định bởi Biểu thức lambda để nó hiển thị lỗi thời gian biên dịch nếu có bất kỳ lỗi nào.

DropdownList không hỗ trợ điều này.

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