Trimiteți date JSON prin POST (ajax) și primiți răspunsul json de la Controller (MVC) (Programare, Jquery, Ajax, Asp.Net Mvc, Json)

Snake Eyes a intrebat.

Am creat o funcție în javascript în acest fel:

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

Am apelat jquery.json-2.3.min.js fișier script și am folosit-o pentru toJSON(array) metoda.

În controler, am acest lucru Add acțiune

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

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

}

Dar sendInfo ca parametru al metodei devine nul.

Modelul:

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

Cum aș putea face în metoda de acțiune când datele au fost trimise cu POST?

Nu știu cum să folosesc. De asemenea, este posibil să trimit înapoi răspunsul (la ajax) prin JSON ?

Comentarii

  • Bună ziua Snake Eyes. Poți te rog să schimbi răspunsul acceptat cu răspunsul lui Neha? Răspunsul lui Praveen Prasad este în prezent stricat, deoarece (la momentul redactării) nu reușește să codifice JSON și nu reușește să seteze antetul JSON Content-Type. Răspunsul lui Neha le face corect pe ambele. Am testat ambele răspunsuri. –  > Por null.
6 răspunsuri
Praveen Prasad

Creați un model

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

Controlori ca mai jos

    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>

Neha
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) {
                ...
            }
        });

și în acțiune

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

puteți să vă legați matricea astfel

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

sper că acest lucru vă poate ajuta.

Comentarii

  • Nu este așa că stringify’ing modelul ridică unele probleme de securitate, deoarece se pot modifica datele și se pot introduce unele vulnerabilități XSS? –  > Por Dave.
  • @Dave nu, un punct final (în acest caz, o funcție de controler mvc) nu ar trebui să aibă NICIODATĂ încredere într-un client, prin urmare, verificarea XSS ar trebui să se facă la server. Controlerul este responsabil pentru analizarea datelor în mod corect și trimiterea datelor înapoi către apelant (aplicația web). Apelantul ar putea fi, de asemenea, ceva de genul fiddler, sau postman, sau poate o altă aplicație… Sper că are sens… –  > Por Dieterg.
  • Pentru informarea dvs., trimiterea unui set de caractere cu application/json nu este validă. Charset se aplică numai la tipurile text/*. application/json este ÎNTOTDEAUNA UTF-8, indiferent de orice antet. –  > Por Rich Remer.
  • Problema mea a fost rezolvată folosind JSON.stringify(), poate cineva să explice de ce avem nevoie de acest lucru în cazul în care cineva trimite un obiect json? –  > Por Muhammad Zeshan Ghafoor.
  • @MohammadZeshan Probabil pentru că corpul, prin intermediul firului, ar arăta astfel [object] în loc de șirul de valori. Ați cere punctului final, care ar fi probabil C#, să citească un obiect JavaScript. –  > Por vapcguy.
Hiep Nguyen

Utilizați JSON.stringify(<data>).

Schimbați-vă codul: data: sendInfo în data: JSON.stringify(sendInfo).Sper că acest lucru vă poate ajuta.

Comentarii

  • Este posibil să fie nevoie să setați și ContentType la „application/json”. Unele puncte finale pot ghici, dar dacă le spuneți că este JSON este mai fiabil. –  > Por null.
user1799669

Pentru a posta JSON, va trebui să îl stringificați. JSON.stringify și să setați processData la false.

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

Kirsten

PersonSheets are o proprietate int Id, , Id nu se află în post, deci modelbinding eșuează. Faceți Id nullable (int?) sau trimiteți cel puțin Id = 0 cu POst .

Abdul Munim

Nu este nevoie să apelați $.toJSON și să adăugați traditional = true

data: { sendInfo: array },
traditional: true

ar fi de ajuns.

Comentarii

  • nu este o alegere bună! Dacă vă urmăresc codul, atunci parametrul metodei Add(object[] sendInfo) va fi nul! –  > Por Snake Eyes.