2008-11-21 30 views
164

Tôi đang tạo một ứng dụng nhỏ để tự dạy mình ASP.NET MVC và JQuery, và một trong các trang là danh sách các mục mà một số có thể được chọn. Sau đó, tôi muốn nhấn một nút và gửi một danh sách (hoặc một cái gì đó tương đương) để điều khiển của tôi có chứa các id của các mục đã được chọn, sử dụng chức năng Post của JQuery.Làm thế nào tôi có thể gửi một mảng chuỗi để ASP.NET MVC Controller mà không có một hình thức?

Tôi đã quản lý để có được một mảng với các id của các yếu tố đã được chọn, và bây giờ tôi muốn đăng bài đó. Một cách tôi có thể làm điều này là để có một hình thức giả trong trang của tôi, với một giá trị ẩn, và sau đó thiết lập giá trị ẩn với các mục đã chọn, và gửi biểu mẫu đó; điều này có vẻ hơi giòn.

Có cách nào sạch hơn để đạt được điều này, bằng cách gửi mảng trực tiếp đến bộ điều khiển? Tôi đã thử một vài điều khác nhau nhưng có vẻ như bộ điều khiển không thể ánh xạ dữ liệu mà nó nhận được. Dưới đây là đoạn mã cho đến nay:

function generateList(selectedValues) { 
    var s = { 
     values: selectedValues //selectedValues is an array of string 
    }; 
    $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json"); 
} 

Và rồi điều khiển của tôi trông như thế này

public ActionResult GenerateList(List<string> values) 
{ 
    //do something 
} 

Tất cả tôi quản lý để có được một "null" trong tham số điều khiển ...

lời khuyên Bất kỳ ?

+0

Mặc dù, bạn có thể truy cập vào cùng một dữ liệu bằng cách sử dụng 'Request [ "giá trị []"]' – Tocco

Trả lời

227

Tôi đã sửa đổi phản hồi của mình để bao gồm mã cho ứng dụng thử nghiệm mà tôi đã thực hiện.

Cập nhật: Tôi đã cập nhật jQuery để đặt cài đặt 'truyền thống' thành true nên điều này sẽ hoạt động trở lại (theo câu trả lời của @DustinDavis).

Đầu tiên javascript:

function test() 
{ 
    var stringArray = new Array(); 
    stringArray[0] = "item1"; 
    stringArray[1] = "item2"; 
    stringArray[2] = "item3"; 
    var postData = { values: stringArray }; 

    $.ajax({ 
     type: "POST", 
     url: "/Home/SaveList", 
     data: postData, 
     success: function(data){ 
      alert(data.Result); 
     }, 
     dataType: "json", 
     traditional: true 
    }); 
} 

Và đây là mã trong lớp điều khiển của tôi:

public JsonResult SaveList(List<String> values) 
{ 
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) }); 
} 

Khi tôi gọi đó là chức năng javascript, tôi nhận được một cảnh báo nói rằng "mục đầu tiên trong danh sách: 'Mục 1'". Hi vọng điêu nay co ich!

+2

Thật tuyệt khi tôi tìm thấy câu trả lời này, bây giờ tôi có thể gửi mảng của Guid và Hành động nhận được chúng vào Danh sách . Cảm ơn – Tx3

+38

Có hai điều quan trọng cần lưu ý ở đây. 1) dataType: "json" 2.) Truyền thống: true.Without chúng chuỗi mảng sẽ không được chuyển đến phương thức hành động – Thanigainathan

+0

Lưu ý rằng 'dataType: 'JSON'' khiến jQuery cố gắng phân tích cú pháp phản hồi dưới dạng JSON và sẽ báo lỗi nếu nó không phải là JSON hợp lệ. – sennett

98

FYI: JQuery đã thay đổi cách họ sắp xếp dữ liệu bài đăng.

http://forum.jquery.com/topic/nested-param-serialization

Bạn phải thiết lập cài đặt 'truyền thống' true, khác khôn ngoan

{ Values : ["1", "2", "3"] } 

sẽ đi ra như

Values[]=1&Values[]=2&Values[]=3 

thay vì

Values=1&Values=2&Values=3 
+8

Đây là thứ khiến tôi phải ngó đầu mình một lúc. thiết lập '$ .ajax ({..., traditional: true});' sẽ giúp hoàn nguyên về tuần tự hóa truyền thống. –

+0

Tôi cần điều này để cho một tuyến đường ASP.NET MVC để tiêu thụ đúng một mảng js đơn giản của các giá trị chuỗi. – BrandonG

+0

Câu trả lời của bạn thực sự hữu ích. Tôi có cùng hoàn cảnh nhưng với 'ints'. Khi tôi sử dụng 'truyền thống: true', nó hoạt động, câu trả lời và liên kết của bạn giải thích * tại sao * của nó. Nó cũng hoạt động khi tôi sử dụng 'type:" POST "', mà không sử dụng 'truyền thống: true'. Tại sao vậy? Bạn có thể vui lòng xây dựng. FYI Tôi đang sử dụng Asp.Net Mvc. – barnes

22

Cảm ơn mọi người vì câu trả lời. Một giải pháp nhanh chóng sẽ được sử dụng jQuery.param phương pháp với truyền thống bộ tham số để đúng để chuyển đổi đối tượng JSON để chuỗi:

$.post("/your/url", $.param(yourJsonObject,true)); 
+0

Hoạt động tốt và được trang bị hoàn hảo cho tôi khi tôi đang sử dụng $ .post() thay vì $ .ajax(). Cảm ơn bạn ! – AFract

1

Như tôi đã thảo luận here,

nếu bạn muốn chuyển đối tượng JSON tùy chỉnh sang hành động MVC, sau đó bạn có thể sử dụng giải pháp này, nó hoạt động như một sự quyến rũ.

public string GetData() 
    { 
     // InputStream contains the JSON object you've sent 
     String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd(); 

     // Deserialize it to a dictionary 
     var dic = 
      Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<String, dynamic>>(jsonString); 

     string result = ""; 

     result += dic["firstname"] + dic["lastname"]; 

     // You can even cast your object to their original type because of 'dynamic' keyword 
     result += ", Age: " + (int)dic["age"]; 

     if ((bool)dic["married"]) 
      result += ", Married"; 


     return result; 
    } 

Lợi ích thực sự của giải pháp này là bạn không cần phải xác định lớp mới cho mỗi kết hợp đối số và bên cạnh đó, bạn có thể dễ dàng chuyển đối tượng của mình sang kiểu gốc.

và bạn có thể sử dụng một phương pháp helper như thế này để tạo điều kiện cho công việc của bạn

public static Dictionary<string, dynamic> GetDic(HttpRequestBase request) 
{ 
    String jsonString = new StreamReader(request.InputStream).ReadToEnd(); 
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString); 
} 
4

Trong .NET4.5, MVC 5

Javascript:

đối tượng trong JS: enter image description here

cơ chế đăng bài.

$('.button-green-large').click(function() { 
     $.ajax({ 
      url: 'Quote', 
      type: "POST", 
      dataType: "json", 
      data: JSON.stringify(document.selectedProduct), 
      contentType: 'application/json; charset=utf-8', 
     }); 
    }); 

C#

Đối tượng:

public class WillsQuoteViewModel 
{ 
    public string Product { get; set; } 

    public List<ClaimedFee> ClaimedFees { get; set; } 
} 

public partial class ClaimedFee //Generated by EF6 
{ 
    public long Id { get; set; } 
    public long JourneyId { get; set; } 
    public string Title { get; set; } 
    public decimal Net { get; set; } 
    public decimal Vat { get; set; } 
    public string Type { get; set; } 

    public virtual Journey Journey { get; set; } 
} 

Bộ điều khiển:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Quote(WillsQuoteViewModel data) 
{ 
.... 
} 

Object nhận:

enter image description here

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.

3

Một thực hiện cũng đang làm việc với danh sách các đối tượng, không chỉ là chuỗi:

JS:

var postData = {}; 
postData[values] = selectedValues ; 

$.ajax({ 
    url: "/Home/SaveList", 
    type: "POST", 
    data: JSON.stringify(postData), 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    success: function(data){ 
     alert(data.Result); 
    } 
}); 

Giả sử rằng 'selectedValues' là mảng các đối tượng.

Trong bộ điều khiển, tham số là danh sách các Chế độ xem tương ứng.

public JsonResult SaveList(List<ViewModel> values) 
{  
    return Json(new { 
      Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    }); 
} 
0

Bạn có thể thiết lập thông số toàn cầu với

jQuery.ajaxSettings.traditional = true; 
Các vấn đề liên quan