Невозможно связать html данные таблицы с mvc моделью контроллера - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть эта модель

 public class Model
{
    public string itemlineId { get; set; }
    public string shipmentID { get; set; }
    public string containerID { get; set; }
    public string containerType { get; set; }
}

У меня есть таблица Dynami c html, я пытаюсь опубликовать данные таблицы через ajax и отправить их на контроллер

 $("body").on("click", "#btnSave", function () {
    //Loop through the Table rows and build a JSON array.
    var itemlists= new Array();
    $("#tblAttachShip TBODY TR").each(function () {
        var row = $(this);
        var itemList = {};
        itemList.itemlineId = row.find("TD").eq(0).html();
        itemList.shipmentID = document.getElementById("txtShipmentID").value
        itemList.containerID = row.find("TD").eq(1).html();
        itemList.containerType = row.find("TD").eq(2).html();

        itemlists.push(itemList);
    });

    //Send the JSON array to Controller using AJAX.
    $.ajax({
        type: "POST",
        url: "/Project/Create",
        data: JSON.stringify({ Model : Itemslists}),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            alert(r + " record(s) inserted.");
        }
    });
});

пока все в порядке, когда я пытаюсь прочитать запрос на публикацию в браузере, я вижу, что запрос содержит правильные данные в формате json

Model: [{itemlineId: "aa", shipmentID: "a", containerID: "aa", containerType: "aa"}]}

, однако, когда Я проверяю контроллер, список не содержит никаких элементов, и никакие значения не были связаны, я проверил несколько сообщений, но не могу понять, что я сделал неправильно, чтобы связать данные json с моделью в контроллере

 [HttpPost]
    public JsonResult Create(List<Model> Model)
    {


        return Json("Success");
    }

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

РЕДАКТИРОВАТЬ

Я думаю, мы оба немного подпрыгнули. Я немного покопался, и похоже, что JSON.stringify действительно понадобится из-за способа, которым ajax публикует данные; Я думаю, что ваша проблема на самом деле может быть с javascript. Когда я скопировал ваш код, были ошибки. Я запускаю это прямо сейчас, которое работает. Предполагая, что ваш опубликованный код был скопирован и вставлен, это:

  data: JSON.stringify({ Model : Itemslists}),

должно быть

  data: JSON.stringify({ Model : itemlists}),

Похоже, это была просто опечатка с именем массива.

Рабочий код:

@{
    ViewBag.Title = "Home Page";
}
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous"></script>
<script type="text/javascript">
    $("body").on("click", "#btnSave", function () {
        //Loop through the Table rows and build a JSON array.
        var itemlists = new Array();
        $("#tblAttachShip TBODY TR").each(function () {

            var row = $(this);
            var itemList = {};
            itemList.itemlineId = row.find("TD").eq(0).html();
            itemList.shipmentID = document.getElementById("txtShipmentID").value
            itemList.containerID = row.find("TD").eq(1).html();
            itemList.containerType = row.find("TD").eq(2).html();

            itemlists.push(itemList);
        });

        //Send the JSON array to Controller using AJAX.
        $.ajax({
            url: './Home/Create',
            type: 'POST',
            data: JSON.stringify({ Model: itemlists }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {
                alert(r + " record(s) inserted.");
            },
            error: function (r) {
                alert(JSON.stringify(r));
            }
        });
    });
</script>

<input type="text" id="txtShipmentID" />
<table id="tblAttachShip">
    <tbody>
        <tr>
            <td>aaa</td>
            <td>aa</td>
            <td>a</td>
        </tr>
        <tr>
            <td>bbb</td>
            <td>bb</td>
            <td>b</td>
        </tr>
    </tbody>
</table>

<button id="btnSave">Save</button>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

        [HttpPost]
        public JsonResult Create(List<Model> Model)
        {


            return Json(new { Message = "Success" });
        }
    }


    public class Model
    {
        public string itemlineId { get; set; }
        public string shipmentID { get; set; }
        public string containerID { get; set; }
        public string containerType { get; set; }
    }
}
0 голосов
/ 12 февраля 2020

Вы странируете свой объект:

data: JSON.stringify({ Model : Itemslists}),

Итак, вы передаете строку в свой контроллер, когда ваш контроллер ожидает List.

С макушки головы я бы скажем попробуйте просто передать объект, например

data: Itemslists,

или если есть причина, по которой вам нужно передать его в виде строки. Измените ваш контроллер, чтобы получить строку, а затем десериализовать ее:

(List<Model>)serializer.Deserialize(jsonString, typeof(List<Model>);
...