2013-09-02 86 views
5

Tôi đang cố truyền một mảng int từ JavaScript tới một bộ điều khiển MVC chấp nhận 2 tham số - một mảng int và một int. Điều này là để thực hiện một chuyển hướng trang để xem được trả về bởi các hành động điều khiển.Truyền một mảng int tới Bộ điều khiển MVC

var dataArray = getAllIds(); //passes back a JavaScript array 
window.location.replace("/" + controllerName + "/EditAll?ids=" + dataArray + "&currentID=" + dataArray[0]) 

dataArray chứa 1,7 như mong đợi cho việc sử dụng mẫu của tôi.

điều khiển Mã

public virtual ActionResult EditAll(int[] ids, int currentID) 
{ 

    currentModel = GetID(currentID); 
    currentVM = Activator.CreateInstance<ViewModel>(); 
    currentVM.DB = DB; 
    currentVM.Model = currentModel; 
    currentVM.ViewMode = ViewMode.EditAll; 
    currentVM.ModelIDs = ids; 

    if (currentModel == null) 
    { 
     return HttpNotFound(); 
    } 

    return View("Edit", MasterName, currentVM); 
} 

Vấn đề là khi kiểm tra việc int [] id truyền cho bộ điều khiển, giá trị của nó là null. currentID được đặt thành 1 như mong đợi.

Tôi đã thử đặt jQuery.ajaxSettings.traditional = true không có hiệu lực Tôi cũng đã thử tạo url phía máy chủ bằng cách sử dụng @ Url.Action trong JavaScript. Tôi cũng đã thử JSON.Stringify trước khi chuyển mảng, ví dụ:

window.location.replace("/" + controllerName + "/EditAll?ids=" + JSON.stringify(dataArray) + "&currentID=" + dataArray[0]) 

Một lần nữa mảng id kết thúc bằng null ở phía bộ điều khiển.

Có ai có bất kỳ gợi ý nào về việc đưa mảng int vào bộ điều khiển chính xác không? Tôi có thể khai báo các tham số như String trong hành động điều khiển và serialize bằng tay và de-serialize tham số nhưng tôi cần phải hiểu làm thế nào để có được khuôn khổ để tự động làm chuyển đổi loại đơn giản.

Cảm ơn!

Trả lời

9

Để vượt qua một loạt các giá trị đơn giản trong MVC, bạn chỉ cần cung cấp cho cùng tên với nhiều giá trị ví dụ URI sẽ kết thúc tìm kiếm một cái gì đó như thế này

/{controllerName}/EditAll?ids=1&ids=2&ids=3&ids=4&ids=5&currentId=1 

Mô hình mặc định ràng buộc trong MVC sẽ ràng buộc này để tham số Action int mảng một cách chính xác.

Bây giờ, nếu nó là một mảng các giá trị phức tạp, có hai phương pháp có thể được thực hiện đối với mô hình ràng buộc. Giả sử bạn có một loại như vậy

public class ComplexModel 
{ 
    public string Key { get; set; } 

    public string Value { get; set; } 
} 

và chữ ký controller action của

public virtual ActionResult EditAll(IEnumerable<ComplexModel> models) 
{ 
} 

Đối với mô hình ràng buộc một cách chính xác, các giá trị cần phải bao gồm một indexer trong yêu cầu ví dụ

/{controllerName}/EditAll?models[0].Key=key1&models[0].Value=value1&models[1].Key=key2&models[1].Value=value2 

Chúng tôi đang sử dụng một indexer int đây nhưng bạn có thể tưởng tượng rằng điều này có thể khá cứng nhắc trong một ứng dụng mà mục trình bày cho một người sử dụng trong giao diện người dùng có thể được thêm vào và xóa bất cứ lúc nào chỉ số/khe trong bộ sưu tập . Với mục đích này, MVC cũng cho phép bạn chỉ định trình lập chỉ mục của riêng bạn cho mỗi mục trong bộ sưu tập và chuyển giá trị đó với yêu cầu cho mô hình mặc định ràng buộc để sử dụng ví dụ:

/{controllerName}/EditAll?models.Index=myOwnIndex&models[myOwnIndex].Key=key1&models[myOwnIndex].Value=value1&models.Index=anotherIndex&models[anotherIndex].Key=key2&models[anotherIndex].Value=value2 

Ở đây chúng ta đã xác định chỉ mục của chúng ta, myOwnIndexanotherIndex cho ràng buộc sử dụng để ràng buộc một bộ sưu tập các loại phức tạp mô hình. Bạn có thể sử dụng bất kỳ chuỗi nào cho người lập chỉ mục của bạn theo như tôi biết.

Hoặc, bạn có thể triển khai trình kết nối mô hình của riêng bạn để quyết định cách yêu cầu đến phải được ràng buộc với mô hình. Điều này đòi hỏi nhiều công việc hơn là sử dụng các quy ước khung mặc định nhưng lại thêm một lớp linh hoạt khác.

+0

Bạn không cần phải tạo một chuỗi dài bằng cách lặp lại mảng và thêm từng phần tử vào chuỗi truy vấn? –

+0

Bạn đã gắn thẻ rằng bạn đang sử dụng jQuery, vì vậy bạn sẽ có thể sử dụng '$ .param' http://api.jquery.com/jQuery.param/ để tạo các giá trị được mã hóa cho bạn, ví dụ: 'window.location.replace ("/"+ controllerName +"/EditAll? "+ $ .param ({ids: dataArray, currentId: dataArray [0]}))' –

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