2011-12-05 32 views
12

Khi chuyển một đối tượng ẩn danh vào một phương thức @ Url.Action (hoặc bất kỳ phương thức tương tự nào của nó), có cách nào để truyền đúng đối tượng bộ sưu tập không hoặc IEnumerable để nó tạo ra một url tương thích với trình kết nối mô hình mặc định?Chuyển một mảng tới RouteValues ​​và cho phép mô hình kết nối url thân thiện

Ví dụ, nói rằng tôi có một hành động như thế này:

public ActionResult Index(ICollection<int> ids) 
    { 
    ...do something 
    } 

và trong mẫu của tôi, tôi làm điều gì đó như thế này:

@Url.Action("Index", routeValues:new int[]{1,2,3}) 

mục tiêu là để có một sản lượng url như thế này:

... /index?ids=1&ids=2&ids=3 

nhưng đầu ra url thực sự giống như sau:

... /index?ids=System.Int[] 

Tôi giả định hiện không có hỗ trợ cho điều này. Nếu không, thì ở phần nào trong MVC tôi có cần tạo trình xử lý tùy chỉnh hay bất cứ thứ gì để ghi đè chức năng mặc định này không?

Trả lời

11

Rất tiếc, hiện tại không có trình trợ giúp hiện có nào cho phép bạn tạo url như vậy. Vì vậy, một khả năng là để làm điều đó bằng tay:

@(Url.Action("Index") + "?" + string.Join("&", new int[] { 1, 2, 3 }.Select(x => "ids=" + x))) 

hoặc viết một phương pháp mở rộng để đóng gói logic:

@Url.ActionWithIds("Index", new int[] { 1, 2, 3 }) 

Kể từ đó là những số nguyên chúng ta không cần mã hóa url nhưng nếu bạn muốn làm điều tương tự với một tập hợp các chuỗi các giá trị phải được mã hóa url đúng cách.

+0

những gì về ngày hiện tại? Là có bất kỳ xây dựng trong người giúp đỡ? – MDDDC

1

Để sử dụng mô hình mặc định chất kết dính, bạn nên kết thúc với một cái gì đó như:

?ids=1&ids=2&ids=3 

bạn có thể trả về một bộ sưu tập riêng tên HttpValueCollection ngay cả những tài liệu nói đó là một NameValueCollection sử dụng tiện ích ParseQueryString. Sau đó thêm các phím theo cách thủ công, HttpValueCollection thực hiện mã hóa cho bạn. Và sau đó chỉ cần thêm các QueryString bằng tay:

var qs = HttpUtility.ParseQueryString(""); 
new List<int> { 1, 2, 3, 4, 5 }.ForEach(x => qs.Add("ids", x.ToString())); 

@Url.Action("Index")[email protected] 
2

đèo mỗi phần tử của mảng để một RouteValueDictionary sử dụng mô hình ràng buộc cú pháp cho các mục đích chuyến đi vòng.

int i = 0; 
var temprvd = arr.ToDictionary(m => String.Format("name[{0}]", i++), m => (object) m); 
@Url.Action("index", new RouteValueDictionary(temprvd)); 

hoặc nối vào từ điển giá trị tuyến đường hiện có.

Truyền giá trị đến một số object (như được hiển thị ở trên) để đảm bảo sử dụng quá tải hàm xây dựng RouteValueDictionary đúng.

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