2010-03-04 24 views
12

Kịch bản của tôi là: Tôi có hai hộp danh sách, một hộp chứa tất cả các mục cơ sở dữ liệu của tôi và một mục rỗng. Người dùng thêm các mục cần thiết từ hộp danh sách đầy đủ vào hộp danh sách rỗng.formcollection chỉ chứa các giá trị mục html.listbox đã chọn? MVC

Tôi đang sử dụng biểu mẫu để gửi tất cả các mục mà người dùng đã thêm.

Vấn đề là, chỉ các mục đã chọn từ hộp danh sách mới được gửi. Vì vậy, nếu người dùng bỏ chọn một số mục, họ sẽ không được gửi trong biểu mẫu. Quan điểm của tôi trông giống như vậy:

<% using (Html.BeginForm("MyAction", "MyController")) 
    { %> 

    <%= Html.ListBox("AddedItems", Model.Items)%> 

    <input type="submit" value="Submit" name="SubmitButton"/> 
<% } %> 

tôi điều khiển trông giống như vậy:

public ActionResult MyAction(FormCollection formCollection) 
{ 
    var addedItems = formCollection["AddedItems"].Split(','); 

    //....more code that does stuff with the items 
} 

Tôi đi về tất cả mọi thứ một cách sai lầm? Có cách nào tốt hơn để gửi các mục? Bạn sẽ làm gì?

Trả lời

22

Tôi cũng đang làm điều này, tôi nghĩ cách tôi giải quyết nó thanh lịch hơn một chút. Về cơ bản tôi chỉ có một chức năng Jquery chạy trước khi bài đăng biểu mẫu chọn tất cả các tùy chọn.

$(function() { 
     $("form").submit(function (e) { 
      $("#box2View option").attr("selected", "selected"); 
     }); 
    }); 
+0

ya thats thực sự những gì tôi đã kết thúc làm. – Darcy

+0

ý tưởng tuyệt vời! thanks =) –

1

Tại sao không có danh sách các mục trong hộp kiểm. Sau đó, bạn có thể lặp qua các hộp kiểm trong hành động của mình và lấy tất cả các hộp kiểm đã chọn.

<% foreach(var item in Model.Items) { %> 

    <%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id 

<% } %> 

public ActionResult MyAction(FormCollection formCollection) 
{ 

      foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>()) 
      { 
       // iterates thru check boxes we got rid of the button 

      } 
} 
+0

Các mục cơ sở dữ liệu theo nghĩa đen có thể là hàng nghìn. Các mục mà người dùng sẽ cần sẽ nằm trong khoảng từ 1 đến 10 trong hầu hết các trường hợp. Tôi muốn một cách dễ dàng để người dùng xem tất cả các mục được chọn. Tôi đã hy vọng rằng tôi có thể ràng buộc html.listbox hoặc một cái gì đó và nhận được tất cả các mục theo cách đó ... không thực sự biết nếu đó là có thể/cách tiếp cận đúng – Darcy

2

Vì đây chỉ là hộp chọn. Bạn không thể đăng tất cả các giá trị trong hộp chọn. Bạn phải sử dụng javascript để bắt các mục đã thêm và lưu trữ chúng trong đầu vào bị ẩn.

Mã chưa được kiểm tra, nhưng tôi nghĩ nó giúp bạn.

<script type="text/javascript"> 
    function addItem() { 
     var allItems = document.getElementById("AllItems"); 
     var op = allItems.options[allItems.selectedIndex]; 
     var hdSelectedItems = document.getElementById("hdSelectedItems"); 
     var lbSelectedItems = document.getElementById("lbSelectedItems"); 

     lbSelectedItems.options[lbSelectedItems.options.length] = op; 

     if (hdSelectedItems.value != '') { 
      hdSelectedItems.value += "," 
     } 
     hdSelectedItems.value += op.value; 
    } 
</script> 
<%= Html.Hidden("hdSelectedItems") %> 
<%= Html.ListBox("AllItems", Model.Items)%> 
<%= Html.ListBox("lbSelectedItems") %> 
<a href="#" onclick="addItem(); return false;">Add</a> 
+0

Cảm ơn tôi đã đi với một giải pháp tương tự như thế này. Tôi chỉ cần thêm các mục vào một Ẩn và nhận nó từ FormCollection của tôi trong bộ điều khiển – Darcy

+1

Không hề, tùy chọn khác đơn giản hơn, bạn có thể làm điều đó với việc chọn tất cả các mục khi gửi biểu mẫu nhưng tôi nghĩ rằng giải pháp không tốt của nó. – cem

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