Senden Sie JSON-Daten über POST (Ajax) und empfangen Sie die JSON-Antwort vom Controller (MVC).

139

Ich habe eine solche Funktion in Javascript erstellt:

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
       });
}

Ich habe die jquery.json-2.3.min.jsSkriptdatei aufgerufen und sie für die toJSON(array)Methode verwendet.

In Controller habe ich diese AddAktion

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

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

}

Aber sendInfoals Methodenparameter wird null.

Das Model:

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;
    }
}

Wie kann ich in Aktion vorgehen, wenn die Daten mit POST gesendet wurden?

Ich weiß nicht, wie ich es benutzen soll. Ist es auch möglich, die Antwort (an Ajax) über JSON zurückzusenden?

Schlangenaugen
quelle
2
Hallo Schlangenaugen. Können Sie bitte die akzeptierte Antwort in Nehas Antwort ändern? Die Antwort von Praveen Prasad ist derzeit fehlerhaft, da sie (zum Zeitpunkt des Schreibens) JSON nicht codiert und den JSON-Content-Type-Header nicht festlegt. Neha macht beides richtig. Ich habe beide Antworten getestet.
null

Antworten:

120

Erstellen Sie ein Modell

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

Controller wie unten

    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>
Praveen Prasad
quelle
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) {
                ...
            }
        });

und in Aktion

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

Sie können Ihr Array so binden

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);
});

hoffe das kann dir helfen.

Neha
quelle
Ist es nicht so, dass die Stringifizierung des Modells einige Sicherheitsbedenken aufwirft, da dies die Daten manipulieren und einige XSS-Schwachstellen einfügen kann?
Dave
@ Dave nein, ein Endpunkt (in diesem Fall eine MVC-Controller-Funktion) sollte NIEMALS einem Client vertrauen, daher sollte die XSS-Prüfung auf dem Server durchgeführt werden. Der Controller ist dafür verantwortlich, die Daten korrekt zu analysieren und an den Anrufer (webapp) zurückzusenden. Der Anrufer könnte auch so etwas wie ein Geiger oder Postbote oder vielleicht eine andere App sein.
Ich
6
Zu Ihrer Information, das Senden eines Zeichensatzes mit application / json ist ungültig. Der Zeichensatz gilt nur für Text- / * -Typen. application / json ist IMMER UTF-8, unabhängig von Headern.
Rich Remer
Wenn ich in der Anfrage dataType durch contentType ersetze, funktioniert es.
Huangli
3
Mein Problem wurde mit JSON.stringify () gelöst. Kann jemand wenig erklären, warum wir dies benötigen, wenn jemand ein JSON-Objekt sendet?
Muhammad Zeshan Ghafoor
13

Verwenden Sie JSON.stringify(<data>).

Ändern Sie Ihren Code: data: sendInfoin data: JSON.stringify(sendInfo). Hoffe das kann dir helfen.

Hiep Nguyen
quelle
1
Möglicherweise müssen Sie den contentType auch auf 'application / json' setzen. Einige Endpunkte mögen raten, aber es ist zuverlässiger, ihnen zu sagen, dass es sich um JSON handelt.
null
2

Um JSON zu veröffentlichen, müssen Sie es stringifizieren. JSON.stringifyund setzen Sie die processDataOption auf false.

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

Ihre PersonSheets haben eine Eigenschaft int Id, Idsind nicht im Beitrag enthalten, daher schlägt die Modellbindung fehl. Machen Sie Id nullbar (int?) Oder senden Sie mindestens Id = 0 mit der POst.

Kirsten
quelle
-2

Sie müssen nicht anrufen $.toJSONund hinzufügentraditional = true

data: { sendInfo: array },
traditional: true

würdest du.

Abdul Munim
quelle
keine gute Wahl! Wenn ich Ihrem Code folge, ist der Methodenparameter Add(object[] sendInfo)null!
Snake Eyes