2010-03-17 31 views
10

Với ASP.net MVC có thể POST một biểu mẫu đến một hành động điều khiển bao gồm các tham số không có trong biểu mẫu, nhưng từ URL?ASP.NET MVC - Phương thức hành động POST với tham số bổ sung từ URL

Ví dụ

Phương pháp hành động trong GroupController:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

Tuyến:

"{controller}/{action}/{idOne}/{idTwo}" 

URL đăng:

/Employee/Show/1/42 

Trong ví dụ này, hình thức là được đăng lên một bộ điều khiển khác, mô hình có giá trị chính xác, tuy nhiên các thông số khác có giá trị mặc định 0.

Hành vi tôi mong đợi là ModelBinder sẽ thấy rằng tôi có hai tham số khớp với tuyến đã cho và gán dòng điện các giá trị của 1 và 42 cho các tham số theo cách tương tự như một hoạt động GET hoạt động.

Hành vi này không được hỗ trợ hay tôi thiếu gì đó?

EDIT: Để được rõ ràng, hình thức trên quan điểm Show cho bộ điều khiển Employee chứa một hình thức được gửi bài đến một bộ điều khiển khác nhau. Chúng tôi có thể gọi nó là Group.

URL hành động hình thức trông như thế này

/Groups/Create/0/0 

Hình thức được khai báo như sau

Html.BeginForm("Create", "Groups") 

Sau khi thử nhiều quá tải khác nhau cho Html.BeginForm Tôi đã tìm thấy rằng các tham số chỉ được ánh xạ khi biểu mẫu URL hành động khớp với URL hiện tại trong thanh địa chỉ trình duyệt.

Vì vậy, nếu tôi điều hướng đến URL /Groups/Create/1/42 Tôi sẽ có biểu mẫu mới. Nếu sau đó tôi gửi biểu mẫu, giá trị tuyến đường URL được chuyển đến hành động POST.

+2

tôi sẽ cố gắng xác định các tuyến đường để bao gồm các mô hình và thiết lập nó như một mặc định null và xem những gì sẽ xảy ra. '{controller}/{action}/{idOne}/{idTwo}/{Model}' –

Trả lời

8

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn action của phần tử được hiển thị là <form> trỏ tới URL chứa giá trị tuyến đường. Điều này cần được thể xảy ra với một trong những quá tải của phương pháp HtmlHelper.BeginForm() mở rộng:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

Hãy cho tôi biết nếu tôi có câu hỏi của bạn hoàn toàn sai :)

+0

Sắp xếp. Như tôi đã nêu trong câu hỏi, hành động đã có chứa một URL với các giá trị tuyến đường chính xác (1 và 42 từ ví dụ). Vấn đề là khi tôi bước vào hành động thực hiện, hai tham số có giá trị 0. Tôi đã thử đề xuất của bạn, nhưng các giá trị vẫn là 0. – Karl

2

Tôi khá chắc chắn rằng bạn chỉ có thể gửi mẫu dữ liệu từ đầu vào bên trong biểu mẫu. Bạn đã xem xét hiển thị chế độ xem theo cách như vậy để tạo các giá trị đầu vào của biểu mẫu tắt URL (có thể với trình trợ giúp HTML?).

CẬP NHẬT: Nếu bạn không muốn sử dụng biểu mẫu nào, hãy sử dụng ControllerContext.RouteData.Values["idOne"] thay vì chuyển nó qua chữ ký phương thức.

+0

Trong biểu mẫu tôi đã thực hiện truy vấn cho các giá trị tuyến đường, ViewContext.RouteData.Values ​​[" idOne "], tuy nhiên trên trang kết xuất cuối cùng có giá trị bằng 0, không phải giá trị từ tuyến đường. Có cách tiếp cận nào khác để nhận giá trị tuyến đường URL hiện tại từ trong Chế độ xem/một phần không? – Karl

+0

Nếu bạn sử dụng phần mở rộng trình trợ giúp Html, bạn sẽ có thể xem nó ra khỏi bản thân trình trợ giúp. Cú pháp sẽ trông giống như 'helper.ViewContext.RouteData.Values ​​[" idOne "]'. Ngoài ra, bạn có thể lưu trữ các giá trị ID đó trong một mô hình khung nhìn và chuyển các giá trị đó cho chế độ xem theo cách đó. –

+0

+1 Suy nghĩ tương tự. Tại sao không bao gồm giá trị đó dưới dạng các trường ẩn trong Html.BeginForm ("Tạo", "Nhóm")? Ngoài ra, bạn có nên 'Đăng' để Tạo biểu mẫu mới không? – Ahmad

0

Gần đây tôi có vấn đề này quá, và vì tôi đã có một con đường khác, đó là ánh xạ tới các tuyến đường mặc định, mà không tính đến các params tuyến đường bổ sung mà tôi đã đi qua trong.

Vì vậy, để làm cho nó làm việc nhanh chóng, tôi đã viết biểu mẫu bằng cách sử dụng thẻ biểu mẫu thay thế và sử dụng @ Url.Action để tạo hành động bắt buộc.

0

Khi bạn truy cập chế độ xem Tạo, giá trị tuyến đường của bạn được sử dụng để đạt được điều đó cần phải được đăng lại cho hành động đăng.

Vì vậy, một tùy chọn có một cặp hiddens, để giữ các id đến từ tuyến đường. Bằng cách này, khi bạn đăng các formas, các giá trị của nó được đăng cùng với các đầu vào khác.

0

Tôi gặp sự cố tương tự, cấu hình RouteConfig đã giải quyết được sự cố này.

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... Và ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

Viết một thẻ mở để đáp ứng. Khi người dùng gửi biểu mẫu, yêu cầu sẽ được xử lý theo mục tiêu tuyến đường. Thành viên này bị quá tải. Để biết thông tin đầy đủ về thành viên này, bao gồm cú pháp, cách sử dụng và các ví dụ, hãy nhấp vào tên trong danh sách quá tải .

Và tất cả các hoạt

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