2012-10-25 33 views
6

Tôi đang làm việc với MVC trong .net 4.0. Tôi có một Html.ActionLink cơ bản và tôi muốn chuyển nhiều tham số tới controller/action.Cách chuyển nhiều tham số (một số đối tượng phức tạp) với Html.ActionLink

Mỗi lần tôi gỡ lỗi ActionResult chỉ MỘT trong các tham số của tôi đi qua và giá trị khác là null (tùy thuộc vào giá trị nào trước tiên). Bây giờ tôi biết tôi có thể vượt qua trong các đối tượng phức tạp kể từ khi tôi có thể nhận được "League" đối tượng để đi qua. Tuy nhiên, tôi không chắc tại sao chỉ có MỘT tham số của tôi làm cho nó thông qua bất cứ lúc nào.

Mã trong Xem: (bạn đừng quấy rầy tôi về ViewBag Tôi biết nó không phải là phổ biến Ngoài ra, Liên đoàn là một đối tượng phức tạp..)

@Html.ActionLink("Sort By WeeK", "Sort", "Schedule", 
       new { league = ViewBag.League, sortType = "Week" }, null) 

Mã trong Bộ điều khiển: (không có bất ngờ ở đây)

public ActionResult Sort(League league, string sortType) 
{ 
    //Do some stuff here 
    return View("Schedule"); 
} 

Tôi đoán câu trả lời sẽ xoay quanh định tuyến. Điều này đưa tôi đến câu hỏi thứ 2 của tôi. Làm thế nào tôi có thể nhận được loại ActionLink này (Action/Controller/Collection của các đối tượng phức tạp và đơn giản) để làm việc mà không cần phải thêm bản đồ mới. Có một RouteMap chung/wildcard tôi có thể thêm vì vậy tôi không phải liên tục thêm bản đồ tuyến đường giải phẫu giống hệt với global.asax. Hoặc có lẽ tôi muốn một số tính linh hoạt trong loại đối tượng mà tôi muốn chuyển vào một Hành động để tôi không thể xác định trước chữ ký chính xác.

Tôi đã xem nhiều bài đăng về chủ đề này nhưng không ai trong số họ trả lời câu hỏi của tôi.

+0

lạ. Hãy thử FormCollection trong hành động của bộ điều khiển của bạn và xem nó có đang trả về nhiều khóa hay không. Trường hợp xấu nhất senario bạn có thể biến nó thành một biểu mẫu và gửi HTML ẩn. – Ammar

+0

Khi bạn nói "Cái nào là cái đầu tiên", bạn có ý nghĩa đầu tiên trong chữ ký phương thức hay đầu tiên trong URL của liên kết không? URL được tạo ra trông như thế nào? –

Trả lời

4

Tôi nghĩ rằng nó có thể bị nhầm lẫn do tham số null. Hãy thử điều này:

@Html.ActionLink("Sort By WeeK", actionName:"Sort", controllerName: "Schedule", routeValues: new { league = ViewBag.League, sortType = "Week" }, htmlAttributes:null) 
+0

Cảm ơn bạn đã phản hồi. Tôi sẽ kiểm tra điều này và lấy lại cho bạn. Khi phạm vi của ứng dụng được mở rộng, đối tượng League đã trở thành tài sản công cộng của bộ điều khiển nên tôi không còn cần phải truyền nó nữa. Tôi sẽ thử đề xuất của bạn trong lần tiếp theo tôi phải chuyển nhiều hơn một tham số và đăng kết quả đây. Thư sau vui vẻ. – ArdAtak

+0

Xin lỗi vì đã trả lời trễ nhưng tôi đã thấy điều này và tôi vẫn nợ một xác nhận. Đề xuất này đã hiệu quả. Cảm ơn. – ArdAtak

0

Im cố gắng nhiều cách nhưng không ai không giúp tôi, cuối cùng i`m mình giải quyết vấn đề, chỉ cần "giải nén" đối tượng của bạn trên các biến từ đối tượng, như thế này:

@{ var sendObject = (MyObject) ViewData["SendObject"]; } 
... 
@Html.ActionLink("Description", "MyActionName", "MyController", new { sendObject.var1, sendObject.var2, sendObjec.var3, sortType = "Week" }, new { @style = "color: white" }) 

Bộ điều khiển:

public ActionResult MyActionName(MyObject sendObject, string sortType) 
{ 
... 
} 

Khung mình wil ràng buộc đối tượng của bạn SendObject

0

Chỉ cần thực hiện việc này:

VIEW: 
@Html.ActionLink("Link text", "Action name", "Controller name", 
         new { paramName1 = @modelDataItem.value, paramName2 = @modelDataItem.value}, null) 

CONTROLLER: 
public ActionResult ActionName(string paramName1 , string paramName2) 

Nb: đảm bảo rằng tên thông số trên hành động của bộ điều khiển giống như tên được sử dụng trong liên kết hành động. Nếu các giá trị không được gửi đến các tham số hành động, hãy kiểm tra xem các mô hình của khung nhìn có chứa giá trị bạn đang tìm kiếm không. Có lẽ nó không bao giờ được gửi đến xem.

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