2012-03-09 25 views
7

Trên một trong các biểu mẫu tôi đang làm việc, nếu người dùng chọn DropDownList "Type", dựa trên giá trị được chọn, tôi sẽ hiển thị Tự động một tập hợp các DropDownLists khác.Đăng các mẫu động trong ASP.NET MVC 3

Ví dụ: Loại: Xe hơi, Căn hộ Chọn "Xe hơi", sẽ tự động thêm hai DropDownLists mới "Giá" & "Mô hình". Chọn "Tòa nhà", sẽ tự động thêm hai DropDownLists mới "Khu vực" & "Tầng"

Câu hỏi của tôi là cách xử lý dữ liệu đã đăng lên máy chủ? Tôi thường sẽ nhận được các lĩnh vực của mẫu và họ nhận được "mô hình ràng buộc" tự động. Nhưng những gì về những lĩnh vực năng động đã được thêm vào trang dựa trên lựa chọn của người dùng? Làm cách nào để tôi truy xuất chúng bên trong Hành động?

Cảm ơn

+0

bạn đã thử sử dụng ajax –

+0

@COLDTOLD đây là vấn đề phía máy chủ, ajax không phải là giải pháp có tác động nào –

+0

@Marek Karbarz bạn có thể làm mới một phần của trang bằng cách thêm các mục mới với ajax –

Trả lời

2

Ah hiểu lầm điều này.

Nếu bạn biết những gì Dropdowns có khả năng có thể được thêm vào, tôi sẽ luôn luôn chỉ có một giá trị trên mô hình của bạn. MVC sẽ đặt chúng làm giá trị mặc định nếu không có gì nhận được.

EDIT: Bạn vẫn có thể truy cập vào bộ sưu tập các hình thức theo một cách thô hơn từ bộ điều khiển withing sử dụng

Request.Form.Keys 
Request.QueryString.Keys 

Request["ExpectedDropdownName"] 

Tất nhiên chúng sẽ được tất cả các giá trị đăng bởi hình thức của bạn vì vậy bạn sẽ cần một cách để nhận ra một trong những danh sách thả xuống của bạn như tiền tố hoặc thứ gì đó. Ví dụ

foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith("dynamic-dropdown-")) 
    { 
     var selectedValue = Request[key]; 
    } 

tôi vẫn không thực sự hiểu làm thế nào bạn có ý định để xử lý các Dropdowns động nếu bạn không biết những gì họ sẽ có và điều này có thể gây ra một số vấn đề và sẽ làm cho xác nhận hoàn toàn năng động và phía khách hàng (không an toàn 100%). Điều đó có thể trình bày một số vấn đề bảo mật là tốt, nhưng có một số sceanarios, nơi bạn có thể sử dụng này và tôi sẽ giả sử bạn có một trong số họ.

Nếu không phải như vậy, đừng quên rằng chỉ vì Mô hình có thuộc tính, nó không phải được đăng lại.

Bạn có thể làm:

public class MyModel 
{ 
    [Required] 
    public string FirstName { get; set; } 

    public string PossibleDropdown1 { get; set; } 

    public string PossibleDropdown2 { get; set; } 
} 

Bộ điều khiển sẽ làm điều đó tốt nhất là nên cư mô hình, nhưng nếu bạn không vượt qua một số lĩnh vực lại từ hình thức, họ sẽ chỉ được null và hành động sẽ vẫn công việc.

Tôi cũng đã triển khai nhiều kịch bản phức tạp hơn như thế này bằng cách sử dụng các đối tượng là con của mô hình gốc và tất cả đều có thể vô hiệu. Điều đó đòi hỏi một chút công việc ưa thích xung quanh ajax gọi đến EditorTemplates trong chế độ xem giả để đảm bảo tiền tố là đúng cho MVC để phân tích cú pháp, nhưng tôi sẽ không đi vào đó ở đây.

+0

Vấn đề là , DropDowns là năng động và không có cách nào để biết trước khi những gì DropDowns sẽ hiển thị! Một câu hỏi là, trong trường hợp tôi đặt làm đầu vào cho hành động một ViewModel mà không có DropDowns, có cách nào để truy cập FormsCollection bên trong phần thân của phương thức Hành động không? – Bill

8

Bạn có thể sử dụng FormCollection để truy cập tất cả các trường trên trang. Tuy nhiên bạn sẽ mất các mô hình tự động ràng buộc và sẽ phải lặp qua bộ sưu tập hình thức để tìm giá trị của bạn như sau:

public ActionResult ActionMethod(FormCollection formCollection) 
{ 
    foreach (var key in formCollection.AllKeys) 
    { 
     var value = formCollection[key]; 
    } 
} 

Tất nhiên bạn cũng có thể chỉ bao gồm các Dropdowns động trong mô hình của bạn.

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