2009-01-13 34 views
8

Tôi có biểu mẫu cho phép người dùng tạo thêm "hàng" bằng cách sử dụng JQuery (sử dụng .clone) để họ có thể quyết định số lượng thông tin mà họ cần gửi. Vấn đề của tôi là tôi không thể tìm ra cách truy cập các mục biểu mẫu này trong bộ điều khiển của mình.Gửi các phần tử biểu mẫu có cùng tên

hình thức đang được gửi có thể trông như thế này

<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Về cơ bản, khối giữa input và chọn có thể được lặp đi lặp lại vô số lần. Khi tôi gửi đến bộ điều khiển, tôi sử dụng FormCollection form để truy cập các phần tử biểu mẫu. từ đó tôi không chắc chắn làm cách nào tôi có thể truy cập các mục đã được gửi. Tôi nghĩ về việc sử dụng một vòng lặp for và sau đó truy cập chúng thông qua một cái gì đó giống như hình thức ["Số tiền"] [i] nhưng rõ ràng là sẽ không hoạt động.

Tôi có đi đúng hướng và nếu có, có ai có bất kỳ đề xuất nào về cách thức hoạt động của tính năng này không?

Xin cảm ơn trước.

+0

Không bao giờ tạo các phần tử có cùng thuộc tính 'id =" ... "'. Khái niệm 'id' là duy nhất. –

Trả lời

1

tôi đã kết thúc nhận ra rằng (blush) cơ chế mà JQuery sử dụng để tìm chuỗi trong bản sao d hàng (để thay thế) về cơ bản là regex. Vì vậy tôi chỉ cần thoát khỏi các dấu ngoặc vuông và dấu chấm. Một khi tôi đã làm điều này tôi đã có thể sử dụng JQuery để tạo ra hình thức như blog của Phil Haack đề nghị.

Về vấn đề tiếp theo của tôi ...!

4

Tôi tin rằng nếu bạn có nhiều trường có tên Số tiền, giá trị sẽ được phân tách bằng dấu phẩy.

Để truy cập mỗi người chỉ cần cố gắng:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' }); 

Cũng nên lưu ý, các đầu vào không được làm sạch trên trình vì vậy nếu một người nào đó đi vào một dấu phẩy vào hộp văn bản nó sẽ gây ra vấn đề.

Do đó, tôi khuyên bạn nên đánh số chúng.

+0

Đó là chính xác, nó chỉ là truy cập chúng mà tôi gặp khó khăn với. – dave

+0

Ah yeah bạn có thể sử dụng phương pháp tách. –

+0

Ok, vì vậy có lẽ tôi đang nhìn vào khu vực không đúng và tôi cần phải tìm hiểu cách thay đổi các thuộc tính biểu mẫu nhân bản bao gồm [] ký tự! – dave

0

tôi sẽ đánh số chúng Amount1, AMOUNT2, Amount3, vv

+0

Vấn đề là JQuery dường như không đổi tên một thuộc tính biểu mẫu nhân bản khi bao gồm các ký tự []. Phần tử biểu mẫu hiện có được nhân bản nhưng id và tên thuộc tính không thay đổi. Nếu không, tôi sẽ sử dụng kỹ thuật http://haacked.com/archive/0001/01/01/model-binding-to-a-list.aspx này. – dave

0

Bạn có thể thay đổi id và tên thuộc tính của đầu vào cho một cái gì đó như thế này "Số tiền [1]", "Số tiền [2]", "Số tiền [3] "(có, thuộc tính id và name có thể chứa các ký tự đặc biệt" ["hoặc"] "). Sau đó, trong bộ điều khiển, viết một trình phân tích cú pháp tham số yêu cầu http để lấy lại các Số tiền làm các bộ sưu tập.

+0

Cảm ơn jscoot, giống như bình luận còn lại cho câu trả lời của Adam. – dave

6

Khám phá Model Binding To A List. Phương thức hành động của bạn phải là:

public ActionResult MyAction(string[] Amount, int[] Item){ 
    // ... 
} 

Tuy nhiên điều này sẽ khiến bạn cần phải "liên kết" các mục. Ngoài ra tạo ra một "Item" class:

public class Item { 
    public string Amount { get; set; } 
    public int Item { get; set; } 
} 

public ActionResult MyAction(IList<Item> items){ 
    // ... 
} 

Và đánh dấu của bạn nên là:

<input type="hidden" name="items.Index" value="0" /> 
<input type="text" name="items[0].Amount" id="items[0].Amount"> 
    <select name="items[0].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="hidden" name="items.Index" value="1" /> 
<input type="text" name="items[1].Amount" id="items[1].Amount"> 
    <select name="items[1].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Etc ...

+0

Cảm ơn phản hồi, tôi đã thực sự đưa ra nhận xét về việc này trong câu trả lời của Spencer. Nó đã đi xuống để JQuery không thích [] trong các thuộc tính id và tên trường vì vậy khi tôi đã đi để thay đổi chúng, JQuery sẽ không làm điều này. Có lẽ tôi nên đăng bài về JQuery vì nó là một cách tốt hơn để làm điều này. – dave

12

Câu hỏi cũ, nhưng vẫn ... Bạn có thể nhận giá trị được đăng dưới dạng mảng bằng cách gọi Request.Form.GetValues hoặc Request.QueryString.GetValues. Ví dụ:

string[] amounts = Request.Form.GetValues("Amount"); 

amounts mảng sẽ chứa các giá trị đúng, vì vậy bạn có thể gửi các giá trị chứa hôn mê, dấu chấm, bất cứ điều gì, và đừng lo lắng về tách/phân tích nó.

Tất nhiên nếu bạn đang chạy MVC, hãy sử dụng modelbinder để làm điều đó. Nhưng bạn có thể sử dụng điều này nếu bạn đang sử dụng biểu mẫu web, một trình xử lý chung, v.v.

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