ahmed_sa Ответов: 1

Как передать данные из представления в контроллер по ajax запросу в качестве входных параметров в метод действия контроллера


Проблема

невозможно передать данные из представления в контроллер по ajax запросу в качестве входных параметров в метод действия контроллера

У меня есть имя модели класса SalesHeader следующим образом

public class SalesHeader
    {
        public int SalesOrderNo { get; set; }
        public int SalesYear { get; set; }
        public int CustomerID { get; set; }
        public Customer Customers { get; set; }
        public ICollection<SalesFooter> SalesFooters { get; set; }
    
    }


Я делаю контроллер SalesOrder на основе модели SalesHeader

в контроллере salesorder у меня есть actionresult Create

Мне нужно передать данные из представления результата действия create в метод Controller salesorder Create в качестве входных параметров

[HttpPost]
public ActionResult Create(SalesHeader sh, SalesFooter[] orderItems)
{
}
заголовок продаж представлен sh as ( SalesOrderNo,SalesYear,CustomerId )
получила футер представлен SalesFooter ш а ( SalesLineNo,артикул,кол-во,цена,Итого )
а SalesFooter[] orderItems представляют собой публичную коллекцию ICollection<salesfooter> SalesFooters { get; set; }
и я буду получать данные элементов из представления в контроллер в виде массива элементов
Дизайн формы

on Header(represent by Sales Header Model) 
SalesOrderNO   1
SalesYear      2019
CustomerNo     2509
on Footer(represent by Sales Footer Model)
SalesLineNo ItemCode  Quantity  Price Total
1            12929       5        10   50
2            17918       4         5   20


так что я поставлю точку останова на методе create и когда нажму кнопку save

должно быть, одну запись на коллекторе продаж(ш) и два рекорда по продажам нижний колонтитул ( строк orderitems)

так что мой главный вопрос как передать эти записи из вида в контроллер

Я работаю дальше asp.net ядро 2.1 visual studio 2017 sql server 2012

после Нажмите кнопку Сохранить, я делаю проверку я нашел две записи уже отправлены, но на регулятор не существовать по продажам заголовка или footet параметры создания

Что я уже пробовал:

my view as following

@model TabDataAccess.Dto.SalesHeader


<script>
    $(document).ready(function () {
        var orderItems = [];
        //Add button click function
        $('#add').click(function () {
            //Check validation of order item
            var isValidItem = true;
            
            //Add item to list if valid
            if (isValidItem) {
                orderItems.push({
                    SalesLineNo: $('#SalesLineNo').val().trim(),
                    ItemCode: $('#ItemCode').val().trim(),
                    Quantity: parseInt($('#Qunatity').val().trim()),
                    UnitPrice: parseFloat($('#UnitPrice').val().trim()),
                    Total: parseInt($('#Qunatity').val().trim()) * parseFloat($('#UnitPrice').val().trim())
                });

                ////Clear fields
                $('#SalesLineNo').val('').focus();
           
                $('#ItemCode','#Qunatity,#UnitPrice').val('');

            }
            //populate order items
            GeneratedItemsTable();

        });
        function GeneratedItemsTable() {
            if (orderItems.length > 0) {
                var $table = $('<table/>');
                $table.append('<thead><tr><th>SalesLineNo</th><th>ItemCode</th><th>Qunatity</th><th>UnitPrice</th><th>Total</th><th></th></tr></thead>');
                var $tbody = $('<tbody/>');
                $.each(orderItems, function (i, val) {
                    var $row = $('<tr/>');
                    $row.append($('<td/>').html(val.SalesLineNo));
                    $row.append($('<td/>').html(val.ItemCode));
                    $row.append($('<td/>').html(val.Qunatity));
                    $row.append($('<td/>').html(val.UnitPrice));
                    $row.append($('<td/>').html(val.Total));
                    var $remove = $('<a href="#">Remove</a>');
                    $remove.click(function (e) {
                        e.preventDefault();
                        orderItems.splice(i, 1);
                        GeneratedItemsTable();
                    });
                    $row.append($('<td/>').html($remove));
                    $tbody.append($row);
                });
                console.log("current", orderItems);
                $table.append($tbody);
                $('#orderItems').html($table);
            }
            else {
                $('#orderItems').html('');
            }
        }
        $("#saveOrder").click(function (e) {
            e.preventDefault();

            var orderItems = [];
            orderItems.length = 0;

            orderItems.push({
                SalesLineNo: $('#SalesLineNo').val().trim(),
                ItemCode: $('#ItemCode').val().trim(),
                Quantity: parseInt($('#Qunatity').val().trim()),
                UnitPrice: parseFloat($('#UnitPrice').val().trim()),
                Total: parseInt($('#Qunatity').val().trim()) * parseFloat($('#UnitPrice').val().trim())
            });


            var data = JSON.stringify({
                orderfooter: orderItems
            });
            $.ajax({
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                type: 'POST',
                url: '/SalesOrder/Create',
                data: orderItems,
                success: function (result) {
                    alert(result);
                    location.reload();
                },
                error: function () {
                    alert("Error!")
                }
            });
        });
    });
   
    
    
</script>
<h2>Create</h2>

<h4>SalesHeader</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="SalesOrderNo" class="control-label"></label>
                <input asp-for="SalesOrderNo" class="form-control" />
                <span asp-validation-for="SalesOrderNo" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="SalesYear" class="control-label"></label>
                <input asp-for="SalesYear" class="form-control" />
                <span asp-validation-for="SalesYear" class="text-danger"></span>
            </div>
           
           
           
            <div class="form-group">
                <label asp-for="CustomerID" class="control-label"></label>
                @*<select asp-for="CustomerID" class="form-control" asp-items="ViewBag.CustomerID"></select>*@
                <input asp-for="CustomerID" class="form-control" />
                <span asp-validation-for="CustomerID" class="text-danger"></span>
            </div>
           
            <div class="details">
                <h4>Order Items</h4>
                <table width="100%">
                    <tr>
                        <td>SalesLineNo</td>
                        <td>ItemCode</td>
                        <td>Quantity</td>
                        <td>UnitPrice</td>
                        <td>Total</td>
                        <td> </td>
                    </tr>
                    <tr>
                        <td>
                            <input type="text" id="SalesLineNo" />
                            <span class="error">Item name required</span>
                        </td>
                        <td>
                            <input type="text" id="ItemCode" />
                            <span class="error">Valid quantity required</span>
                        </td>
                        <td>
                            <input type="text" id="Qunatity" />
                            <span class="error">Valid rate required</span>
                        </td>
                        <td>
                            <input type="text" id="UnitPrice" />
                            <span class="error">Valid rate required</span>
                        </td>
                        <td>
                            <input type="text" id="Total" />
                            <span class="error">Valid rate required</span>
                        </td>
                        <td>
                            <input type="button" id="add" value="add" />
                        </td>
                    </tr>
                </table>
                <div id="orderItems" class="tablecontainer">

                </div>
                @*<div style="padding:10px 0px; text-align:right">
            <input id="submit" type="button" value="Save" style="padding:10px 20px" />
        </div>*@
                <div class="form-group">
                    @*<input type="submit" value="Create" class="btn btn-default" />*@
                    <button id="saveOrder" type="submit"value="Create" class="btn btn-default">Save Order</button>
                </div>
            </div>
            </form>
 
</div>
    </div>

1 Ответов

Рейтинг:
2

Bohdan Stupak

Вы ничего не получаете из-за формы того, что вы посылаете от клиента

var data = JSON.stringify({
    orderfooter: orderItems
});

не соответствует тому, что вы ожидаете увидеть на сервере. Судя по вашему клиентскому коду, вы ожидаете чего-то вроде
public class YourData 
{
  ICollection<SalesHeader> OrderFooter {get; set;}
}

В любом случае ваши данные на клиенте и на сервере должны иметь одинаковые поля