Gửi dữ liệu JSON qua POST (ajax) và nhận phản hồi json từ Trình điều khiển (MVC)


139

Tôi đã tạo một hàm trong javascript như thế:

function addNewManufacturer() {
       var name = $("#id-manuf-name").val();
       var address = $("#id-manuf-address").val();
       var phone = $("#id-manuf-phone").val();

       var sendInfo = {
           Name: name,
           Address: address,
           Phone: phone
       };

       $.ajax({
           type: "POST",
           url: "/Home/Add",
           dataType: "json",
           success: function (msg) {
               if (msg) {
                   alert("Somebody" + name + " was added in list !");
                   location.reload(true);
               } else {
                   alert("Cannot add to list !");
               }
           },

           data: sendInfo
       });
}

Tôi đã gọi jquery.json-2.3.min.jstập tin script và tôi đã sử dụng nó cho toJSON(array)phương thức.

Trong bộ điều khiển, tôi có Addhành động này

[HttpPost]
public ActionResult Add(PersonSheets sendInfo) {
    bool success = _addSomethingInList.AddNewSomething( sendInfo );

    return this.Json( new {
         msg = success
    });

}

Nhưng sendInfo khi tham số phương thức trở thành null.

Ngươi mâu:

public struct PersonSheets
{
    public int Id;
    public string Name;
    public string Address;
    public string Phone;
}

public class PersonModel
{
    private List<PersonSheets> _list;
    public PersonModel() {
         _list= GetFakeData();
    }

    public bool AddNewSomething(PersonSheets info) {
         if ( (info as object) == null ) {
            throw new ArgumentException( "Person list cannot be empty", "info" );
         }

         PersonSheets item= new PersonSheets();
         item.Id = GetMaximumIdValueFromList( _list) + 1;
         item.Name = info.Name;
         item.Address = info.Address;
         item.Phone = info.Phone;

         _list.Add(item);

         return true;
    }
}

Làm thế nào tôi có thể làm trong phương thức hành động khi dữ liệu được gửi bằng POST?

Tôi không biết cách sử dụng. Ngoài ra, có thể gửi lại phản hồi (tới ajax) qua JSON không?


2
Chào mắt rắn. Bạn có thể vui lòng thay đổi câu trả lời được chấp nhận cho câu trả lời của Neha không? Câu trả lời của Praveen Prasad hiện đang bị phá vỡ vì nó (tại thời điểm viết) không mã hóa JSON và không đặt tiêu đề Kiểu nội dung JSON. Neha chính xác làm cả hai điều này. Tôi đã thử cả hai câu trả lời.
null

Câu trả lời:


120

Tạo một mô hình

public class Person
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
}

Bộ điều khiển như dưới đây

    public ActionResult PersonTest()
    {
        return View();
    }

    [HttpPost]
    public ActionResult PersonSubmit(Vh.Web.Models.Person person)
    {
        System.Threading.Thread.Sleep(2000);  /*simulating slow connection*/

        /*Do something with object person*/


        return Json(new {msg="Successfully added "+person.Name });
    }

Javascript

<script type="text/javascript">
    function send() {
        var person = {
            name: $("#id-name").val(),
            address:$("#id-address").val(),
            phone:$("#id-phone").val()
        }

        $('#target').html('sending..');

        $.ajax({
            url: '/test/PersonSubmit',
            type: 'post',
            dataType: 'json',
            contentType: 'application/json',
            success: function (data) {
                $('#target').html(data.msg);
            },
            data: JSON.stringify(person)
        });
    }
</script>

141
var SendInfo= { SendInfo: [... your elements ...]};

        $.ajax({
            type: 'post',
            url: 'Your-URI',
            data: JSON.stringify(SendInfo),
            contentType: "application/json; charset=utf-8",
            traditional: true,
            success: function (data) {
                ...
            }
        });

và trong hành động

public ActionResult AddDomain(IEnumerable<PersonSheets> SendInfo){
...

bạn có thể liên kết mảng của bạn như thế này

var SendInfo = [];

$(this).parents('table').find('input:checked').each(function () {
    var domain = {
        name: $("#id-manuf-name").val(),
        address: $("#id-manuf-address").val(),
        phone: $("#id-manuf-phone").val(),
    }

    SendInfo.push(domain);
});

Hy vọng điều này có thể giúp bạn.


Không phải vì vậy mà việc xâu chuỗi mô hình làm tăng một số lo ngại về bảo mật vì có thể làm xáo trộn dữ liệu và chèn một số lỗ hổng XSS không?
Dave

@ Không có, điểm cuối (trong trường hợp này là chức năng của bộ điều khiển mvc) KHÔNG BAO GIỜ nên tin tưởng một khách hàng, do đó kiểm tra XSS nên được thực hiện tại máy chủ. Bộ điều khiển chịu trách nhiệm phân tích dữ liệu theo cách chính xác và gửi lại dữ liệu cho người gọi (webapp). Người gọi cũng có thể là một cái gì đó như fiddler, hoặc người đưa thư, hoặc có thể là một ứng dụng khác .. Hy vọng điều này có ý nghĩa ..
Dieterg

6
FYI, gửi một bộ ký tự với ứng dụng / json là không hợp lệ. Bộ ký tự chỉ áp dụng cho các loại văn bản / *. application / json là LUÔN LUÔN UTF-8, bất kể tiêu đề nào.
Rich Remer

Khi tôi thay thế dataType bằng contentType trong yêu cầu, nó sẽ hoạt động.
huangli

3
Vấn đề của tôi đã được giải quyết bằng JSON.opesify (), có ai có thể giải thích được tại sao chúng ta cần điều này trong khi nếu ai đó gửi đối tượng json không?
Muhammad Zeshan Ghafoor

13

Sử dụng JSON.stringify(<data>) .

Thay đổi mã của bạn: data: sendInfothành data: JSON.stringify(sendInfo). Hy vọng điều này có thể giúp bạn.


1
Bạn cũng có thể cần phải đặt contentType thành 'application / json'. Một số điểm cuối có thể đoán, nhưng nói với họ đó là JSON đáng tin cậy hơn.
null

2

Để đăng JSON, bạn sẽ cần phải xâu chuỗi nó. JSON.stringifyvà đặt processDatatùy chọn thành false.

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

0

PersonSheets của bạn có một thuộc tính int Id, Idkhông có trong bài viết, vì vậy việc tạo mô hình không thành công. Biến Id thành nullable (int?) Hoặc gửi ít nhất Id = 0 với POst.


-2

Bạn không cần phải gọi $.toJSONvà thêmtraditional = true

data: { sendInfo: array },
traditional: true

sẽ làm.


không có lựa chọn tốt Nếu tôi làm theo mã của bạn thì tham số phương thức Add(object[] sendInfo)sẽ là null!
Mắt rắn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.