Файл изображения и загрузка данных в ASP.NET MVC - PullRequest
0 голосов
/ 28 июня 2018

Я работаю над созданием страницы, на которой пользователь будет вводить данные, относящиеся к клиенту (например, имя, ссылочный номер, дата), и ниже этой заполненной таблицы (число строк является динамическим, не знаю, сколько строк будет у пользователя) с элементами Получено от Заказчика. Каждая строка таблицы содержит информацию, относящуюся к элементу, такую ​​как имя детали, номер детали, количество и т. Д. Наряду с этой информацией нам необходимо загрузить изображение (одно изображение) физической копии полученной бумаги. Мы должны отправить все эти данные в контроллер. Пробовал использовать FormData в javascript и ajax, как показано ниже:

function Submitbtn() {

            var shownVal = document.getElementById("CustomerId").value;
            var CustomerId = document.querySelector("#CNList option[value='" + shownVal + "']").dataset.value;
            var formData = new FormData();
            var totalFiles = document.getElementById("imageUploadForm").files.length;
            for (var i = 0; i < totalFiles; i++) {
                var file = document.getElementById("imageUploadForm").files[i];
                formData.append("imageUploadForm", file);
            }
             formData.append("CustomerRef", document.getElementById("CustomerRef").value);
            formData.append("DateCreated",$("#DateCreated").val());
            formData.append("ChallanDate", $("#ChallanDate").val());
            $('.signal').show()
            $.ajax({
                url: '@Url.Action("SubmitData", "Material")',
                type: "POST",
                processData: false,
                contentType: false,
                data: formData,
                success: function (response) {
                    $('.signal').hide();
                    if (data.result == false) {
                        alert(data.msg);
                    }
                    else {
                        alert("Saved succesfully");
                        $('#updateData').html(data);
                    }
                },
                error: function (er) {
                    alert(er);
                }

            });
}

ControllerCode:

    public ActionResult SubmitData()
            {
                    var pic = System.Web.HttpContext.Current.Request.Files["imageUploadForm"];
                    var id = System.Web.HttpContext.Current.Request.Params["InvoiceViewModel"];

Code processing
                InvoiceViewModel vm = new InvoiceViewModel();
                return PartialView("_AddNewTable", vm);

            }

Вышеописанное работает нормально, но я не могу отправить связанные данные таблицы. Я мог бы послать значения для CustomerRef, ChallanDate и т. Д., Но не смог добавить массив в этом. На мой взгляд, если я добавлю массив в formData, я не смогу получить его в контроллере, так как он ожидает только строковые значения.

Если мы не отправляем изображение, то все данные успешно отправляются на контроллер через ajax, как показано ниже:

var shownVal = document.getElementById("CustomerId").value;
            var CustomerId = document.querySelector("#CNList option[value='" + shownVal + "']").dataset.value;
           var CustomerRef = document.getElementById("CustomerRef").value;
            var DateCreated = $("#DateCreated").val();
            var ChallanDate = $("#ChallanDate").val();

            var InwardMaterialViewModel = {
                DateCreated: DateCreated,
                ChallanDate: ChallanDate,
                CustomerId: CustomerId,
                CustomerRef: CustomerRef,
                Orders: InwardMaterialArray,
                };

            $.ajax({
                beforeSend: function () {
                    $('.signal').show()
                },
                type: 'POST',
                url: '@Url.Action("SubmitData", "Material")',
                          datatype: "json",
                contentType: false,
                processData: false,
                data: InwardMaterialViewModel,
                success: function (data) {
                    $('.signal').hide();
                    if (data.result == false) {
                        alert(data.msg);
                    }
                    else {
                        alert("Saved succesfully");
                        $('#updateData').html(data);
                        }
                },
                error: function (response) {

                }
            });

Попытка размещения файла изображения в InwardMaterialViewModel, но это не сработало. Исследовали и обнаружили, что мы можем отправить данные и изображение, используя метод <form action="" method="post" enctype="multipart/form-data">, как описано в этой ссылке: https://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/ Но тогда проблема в том, что данные таблицы не отправляются в модели, так как мы не знаем, сколько строк будет вводить пользователь. Пожалуйста, сообщите.

Более подробная информация по запросу:

Главный вид:

@model xxxx.ViewModels.InwardMaterialViewModel

@{
    ViewBag.Title = "AddNew";
}

<h2>AddNew</h2>
<link href="~/Content/Loader.css" rel="stylesheet" type="text/css" />
<div class="container margin-top-lg">
                <div class="row">
            <div class="col-lg-12">

                <div class="col-sm-6">
                    <div class="form-group">
                        <label for="DateCreated">Date :</label>
                        @Html.TextBoxFor(d => d.DateCreated, "{0:dd/MM/yyyy}", new { id = "DateCreated", @class = "form-control", maxlength = "500" })
                    </div>
                </div>

                <div class="col-sm-6">
                    <div class="form-group">
                        <label for="CustomerName">Customer Name :</label>
                        @*@Html.EditorFor(model => model.CustomerRef, new { id = "CustomerName", htmlAttributes = new { @class = "form-control" } })*@
                        @*@Html.DropDownListFor(p => p.Customers, new SelectList(Model.Customers, "CustomerId", "CustomerName"), "Select Name", new { id = "CustomerId", @class = "form-control" })*@
                        <input name="id" class="form-control" type="search" list="CNList" autocomplete="on" id="CustomerId" />

                    </div>
                </div>


                <div class="col-sm-6">
                    <div class="form-group">
                        <label for="CustomerRef">Customer Ref. :</label>
                        @Html.TextBoxFor(d => d.CustomerRef, new { id = "CustomerRef", @class = "form-control", maxlength = "2000" })
                    </div>
                </div>

                <div class="col-sm-6">
                    <div class="form-group">
                        <label for="CustomerRef">Challan Date :</label>
                        @Html.TextBoxFor(d => d.ChallanDate, "{0:dd/MM/yyyy}", new { id = "ChallanDate", @class = "form-control", maxlength = "500" })
                    </div>
                </div>
            </div>
        </div>


        <div class="col-sm-6">
            <div class="form-group">

                <div class="field" align="left">
                    <label for="ChallanImage">Challan Image :</label>
                    <input type="file" id="imageUploadForm" name="images" multiple="multiple" />
                </div>


            </div>

        </div>
        <br />
        <div class="col-md-12">
            <div id="updateData" class="table-responsive">
                @Html.Partial("_AddNewTable")
            </div>
        </div>
        <br>
        </div>

<br />

<a href="@Url.Action("Index", "Home")" class="btn btn-primary btn-large pull-left"> Back</a>
<button type="submit" id="id" onclick="Submitbtn()" class="btn btn-success pull-right"> Submit </button>

Частичное представление: с данными таблицы

@model xxxx.ViewModels.InwardMaterialViewModel
<table id="data_table">

    <tr>

        <th>Part Name</th>
        <th>Part No</th>
        <th>Serial No</th>
        <th>Quantity</th>
        <th>Repair Type</th>
        <th>User</th>
        <th>Remarks</th>
        <th>Add/Delete</th>

    </tr>

        @foreach (var item in Model.Orders)
        {
            <tr>
                <td>@item.PartName</td>
                <td>@item.PartNo</td>
                <td>@item.SerialNo</td>
                <td>1</td>
                <td>@item.RepairType</td>
                <td>@item.UserName</td>
                <td>@item.Remarks</td>
                <td>
                    <input type='button' value='Delete' class='delete' onclick='Delete(@item.OrderGUID)' />
                </td>

            </tr>
        }


    <tfoot>
        <tr>
            <td><input name="id" class="form-control" type="search" list="lan" autocomplete="on" id="Part_Name" onchange = "getPartNumber()" /></td>
           @*<td>@Html.DropDownListFor(p => p.Parts, new SelectList(Model.Parts, "PartName", "PartName"), "Select Name", new { id = "Part_Name", @class = "form-control", @onchange = "getPartNumber()" })</td>*@
            <td><input type="text" class="form-control" id="Part_No" readonly/></td>

            <td><input type="text" class="form-control" id="Serial_No" /></td>
            <td><input type="text" class="form-control" id="Quantity" value="1" readonly/></td>
            <td>
                @Html.DropDownListFor(p => p.RepairType, new SelectList(Model.RepairTypeList, "Text", "Value"), "Select Type", new { id = "Repair_Type", @class = "form-control" })
            </td>
            <td>
                @Html.DropDownListFor(p => p.Users, new SelectList(Model.Users, "UserId", "UserName"), "Select Name", new { id = "User", @class = "form-control" })
            </td>

            <td><input type="text" class="form-control" id="Remarks" /></td>
            <td>
                <input type="button" class="add" onclick="add_row();" value="Add Row">
            </td>
        </tr>
    </tfoot>
</table>

<datalist id="lan">
    @foreach (var item in Model.Parts)
    {
        <option id="@item.PartId" data-value="@item.PartId" value="@item.PartName"></option>

    }

</datalist>

on add_row: данные строки вводятся в массив

var InwardMaterialArray = [];
    function add_row() {
        var Part_Name = document.getElementById("Part_Name").value;
        var Part_No = document.getElementById("Part_No").value;
        var Serial_No = document.getElementById("Serial_No").value;
        if (Serial_No == "") {
            alert("Serial No. must be filled out");
            return false;
        }
        var Quantity = document.getElementById("Quantity").value;
        var Repair_Type = document.getElementById("Repair_Type").value;
        var User = document.getElementById("User").value;
        var Remarks = document.getElementById("Remarks").value;
        var OrderDto = {
            PartName: Part_Name,
            PartNo: Part_No,
            SerialNo: Serial_No,
            Qty: Quantity,
            RepairType: Repair_Type,
            AssignedUserId: User,
            Remarks: Remarks,

        };

        InwardMaterialArray.push(OrderDto);
        var InwardMaterialViewModel = {
            Orders : InwardMaterialArray
        };
        $.ajax({
            beforeSend: function () {
                $('.signal').show()
            },
            type: 'POST',
            url: '@Url.Action("AddRow", "Material")',

            data: InwardMaterialViewModel,
            success: function (data) {
                $('.signal').hide();
                if (data.result == false) {
                    alert(data.msg);
                }
                else {
                    $('#updateData').html(data);
                }
            },
            error: function (response) {

            }
        });

    }

Все данные, введенные в строки, находятся в массиве InwardMaterialArray, заполненном с помощью InwardMaterialArray.push(OrderDto); в add_row метод выше.

Так что мне нужно отправить этот массив InwardMaterialArray вместе с данными, заполненными для клиента выше, и изображение на контроллер, все сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...