2009-01-02 42 views
9

Tôi có một ứng dụng mà tôi cần người dùng có thể cập nhật hoặc xóa các hàng dữ liệu từ cơ sở dữ liệu. Các hàng được hiển thị cho người dùng bằng cách sử dụng vòng lặp foreach trong tệp .aspx của chế độ xem của tôi. Mỗi hàng sẽ có hai trường văn bản (txtName, txtDesc), nút cập nhật và nút xóa. Những gì tôi không chắc chắn, là làm thế nào để tôi có nút cập nhật gửi tin nhắn đến bộ điều khiển cho hàng để cập nhật? Tôi có thể thấy một vài cách để thực hiện việc này:Ánh xạ các nút riêng lẻ trên ASP.NET MVC Xem tới các hành động điều khiển

  1. Đặt mỗi hàng trong thẻ biểu mẫu riêng, sau đó nhấp vào nút cập nhật, chỉ gửi giá trị cho hàng đó (cũng sẽ là trường ẩn) với rowId) và lớp điều khiển sẽ lấy tất cả các giá trị bài làm tham số cho phương thức Cập nhật trên bộ điều khiển.
  2. Bằng cách nào đó, có nút được viết theo cách để chỉ gửi lại các giá trị cho hàng đó bằng POST tới bộ điều khiển.

Có cách nào để thực hiện việc này không? Một điều tôi quan tâm là nếu mỗi hàng có các tên khác nhau cho các điều khiển được gán bởi ASP.NET (txtName1, txtDesc1, txtName2, txtDesc2), thì giá trị của chúng sẽ được ánh xạ tới các tham số chính xác của phương thức Controller như thế nào?

+0

Nếu bạn sử dụng thẻ nút thay vì nhập, bạn có thể đặt giá trị và văn bản hiển thị riêng biệt sau đó kiểm tra giá trị trong bộ điều khiển. –

Trả lời

11

Bạn có thể sử dụng nhiều hình thức, và thiết lập các hành động trên hình thức là như thế này:

<form method="post" action="/YourController/YourAction/<%=rowId%>"> 

Vì vậy, bạn sẽ có YourController/YourAction/1, YourController/YourAction/2 và vân vân.

Không cần phải đặt tên khác nhau cho các hộp văn bản khác nhau, chỉ cần gọi chúng là txtName, txtDesc v.v. (hoặc thậm chí tốt hơn, loại bỏ các tiền tố txt đó). Vì chúng ở các dạng khác nhau, chúng sẽ không trộn lẫn.

Sau đó, trên hành động mà bạn làm điều gì đó như

public ActionResult YourAction(int id, string username, string description) 

đâu tên, mô tả là những cái tên tương tự mà bạn sử dụng trên các hình thức kiểm soát (do đó họ được ánh xạ tự động). Tham số id sẽ được tự động ánh xạ tới số bạn đặt trên hành động biểu mẫu.

+0

Câu trả lời này là chính xác. Tôi sẽ thêm rằng, trong khi các tên phần tử có thể và nên được lặp lại cho mỗi hình thức, mỗi phần tử phải có một ID duy nhất. –

+0

Nếu tôi đang sử dụng một điều khiển người dùng ASP.NET cho mỗi hàng, và trong điều khiển tôi đang sử dụng hộp văn bản ASP.NET và các nút, là nó có thể làm toàn bộ lặp đi lặp lại tên, điều ID duy nhất? – skb

+0

Hoặc bạn cũng có thể tạo một nút html đơn giản và nhận giá trị của nó trên phương thức bài của Bộ điều khiển: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons- in-the-same-form.aspx –

0

Vì rodbv cho biết bạn muốn sử dụng các yếu tố riêng biệt <form>.

Khi bạn đang sử dụng Asp.Net MVC hoặc html cổ điển (php, asp cổ điển, v.v ...), bạn phải quên cách xử lý nút bấm của Asp.Net. Khi một biểu mẫu được đăng trở lại máy chủ web, tất cả máy chủ biết về chỉ đơn giản là "biểu mẫu đã được gửi và chứa các phần tử đầu vào sau".

Asp.net (tiêu chuẩn) thêm vòng bao quanh nhiều hành động postback html tiêu chuẩn bằng javascript (hàm javascript __doPostback được sử dụng hầu như ở mọi nơi) và điều này thêm thông tin về yếu tố đầu vào nào của biểu mẫu gây ra postback và phân phối đến máy chủ trong biến biểu mẫu ẩn. Bạn có thể bắt chước hành vi này nếu bạn thực sự mong muốn, nhưng tôi khuyên bạn nên chống lại nó.

Nó có vẻ lạ 'xả rác' một trang với nhiều <form> 's, tuy nhiên nó sẽ có nghĩa là postback cho máy chủ sẽ được trọng lượng nhẹ hơn và nên làm cho mọi thứ chạy nhanh hơn một chút cho người dùng.

4

Bạn cũng có thể có nhiều nút "hợp lệ tên" trên biểu mẫu như:

<input type="submit" value="Save" name="btnSave" id="btnSave"/> 
<input type="submit" value="Delete" name="btnDelete" id="btnDelete"/

và hơn kiểm tra để xem những gì bạn trình đã nhận được. Chỉ có thể có một trình hành động gửi theo mẫu, vì vậy nó cũng giống như tất cả các đệ trình các nút khác không thực sự tồn tại ở nơi đầu tiên:

if (HttpContext.Request.Form["btnDelete"] != null) { 
    //Delete stuff 
} elseif (HttpContext.Request.Form["btnSave"] != null) { 
    //Update stuff 
} 

Tôi cũng nghĩ rằng bạn có thể thực hiện một ActionMethodSelectorAttribute tùy chỉnh như đây http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx (cũng được liệt kê ở trên) để có mã tách biệt hơn.

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