Запись отредактированной коллекции в серверную часть (ядро ASP.NET MVC)

У меня есть модальное окно Razor, которое получает данные от BE.

Вот модель

 public class LocationServiceEditDto: EntityDto<int?>
{
    public int ServiceId { get; set; }

    public int? LocationId { get; set; }

    public decimal? Cost { get; set; }

    public int? MaterialUomId { get; set; }

    public string MaterialUomName { get; set; }

    public string LocationName => Location?.Name;

    [JsonIgnore]
    public  LocationNameDto Location { get; set; }

    public ICollection<LocationServicePriceDto> LocationServicePrices { get; set; }
}

в BE я пополняю коллекцию LocationServicePrices

А затем в View я показываю это вот так

<div class = "modal-body box-wrap">
    <form role = "form" novalidate class = "form-validation" name = "ServicePriceInformationsForm">
        <input type = "hidden" asp-for = "Id"/>
        <input type = "hidden" asp-for = "ServiceId"/>
        <div class = "form-group">
            <label class = "required-label">@L("Location")</label>
            <select class = "form-control" required asp-for = "LocationId">
                <option value = "">@L("SelectALocation")</option>
                @if (Model.LocationId.HasValue)
                {
                    <option selected value = "@Model.LocationId">@Model.LocationName</option>
                }
            </select>
        </div>
        <div class = "form-group">
            <label class = "required-label">@L("MaterialUom")</label>
            <select class = "form-control" asp-for = "MaterialUomId" id = "ServicePrice_MaterialUomId">
                <option value = "">Select an option</option>
                @if (Model.MaterialUomId > 0)
                {
                    <option value = "@Model.MaterialUomId">@Model.MaterialUomName</option>
                }
            </select>
        </div>
        <div class = "form-group">
            <label>@L("Cost")</label>
            <input class = "form-control" type = "text" asp-for = "Cost" data-rule-number = "true" data-rule-min = "0" data-rule-max = "@AppConsts.MaxDecimalDatabaseLength">
        </div>
        @foreach (var tier in @Model.LocationServicePrices)
        {
            <div class = "form-group">
                <label>@tier.PricingTierName</label>
                <input class = "form-control" type = "text" asp-for = "@tier.PricePerUnit" data-rule-number = "true" data-rule-min = "0" data-rule-max = "@AppConsts.MaxDecimalDatabaseLength">
            </div>
        }
    </form>
</div>

Я хочу обновить каждый ввод в foreach и обновить @Model.LocationServicePrices.

На данный момент, когда я ввожу значения и отправляю данные в BE, коллекция равна нулю.

Я сохраняю такие данные в файле .js

this.save = function () {
        if (!_$form.valid()) {
            _$form.showValidateMessage();
            return;
        }

        var servicePrice = _$form.serializeFormToObject();

        _modalManager.setBusy(true);
        _serviceService.editLocationService(servicePrice).done(function () {
            abp.notify.info('Saved successfully.');
            _modalManager.close();
            abp.event.trigger('app.createOrEditServicePriceModalSaved');
        }).always(function () {
            _modalManager.setBusy(false);
        });
    };

Код для метода serializeFormToObject

 $.fn.serializeFormToObject = function () {
    var $form = $(this);
    var fields = $form.find('[disabled]');
    fields.prop('disabled', false);
    var json = $form.serializeJSON();
    fields.prop('disabled', true);
    return json;
};

Как я могу это исправить?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, как работает весь ваш js-код, но система привязки модели связывает свойство по имени. Если ваш сервер получает данные формы, поскольку LocationServicePrices является моделью списка, вам необходимо передавать их по имени, например: name = "LocationServicePrices[@i].PricePerUnit".

@{
    int i = 0;
}
@foreach (var tier in @Model.LocationServicePrices)
{
    <div class = "form-group">
        <label>@tier.PricingTierName</label>
        <input class = "form-control" type = "text" asp-for = "@tier.PricePerUnit" 
            name = "LocationServicePrices[@i].PricePerUnit" data-rule-number = "true" data-rule-min = "0" data-rule-max = "@AppConsts.MaxDecimalDatabaseLength">
    </div>
    i++;
}

Если ваш бэкэнд получает строку json, правильный json должен быть:

{ 
"Id": "", 
"ServiceId": "2031", 
"LocationId": "2", 
"MaterialUomId": "6", 
"Cost": "123", 
"LocationServicePrices": [
    { "PricePerUnit": "1"},
    { "PricePerUnit": "2"},
    {"PricePerUnit": "3"}, 
    {"PricePerUnit": "4"}, 
    {"PricePerUnit": "5" }
 ]
}

ОБНОВЛЯТЬ:

О том, как сгенерировать строку json. Вы можете использовать js-код ниже:

@model LocationServiceEditDto
<div class = "modal-body box-wrap">
    <form role = "form" novalidate class = "form-validation" name = "ServicePriceInformationsForm">
        <input type = "hidden" asp-for = "Id" />
        <input type = "hidden" asp-for = "ServiceId" />
        <div class = "form-group">
            <select class = "form-control" required asp-for = "LocationId">
                <option value = "">sssss</option>
                <option value = "1">aa</option>
                <option value = "2">bb</option>
                <option value = "3">cc</option>
            </select>
        </div>
        <div class = "form-group">
            <select class = "form-control" asp-for = "MaterialUomId" id = "ServicePrice_MaterialUomId">
                <option value = "">Select an option</option>
                @if (Model.MaterialUomId > 0)
                {
                    <option value = "@Model.MaterialUomId">@Model.MaterialUomName</option>
                }
            </select>
        </div>
        <div class = "form-group">
            <input class = "form-control" type = "text" asp-for = "Cost" data-rule-number = "true" data-rule-min = "0" data-rule-max = "7">
        </div>
        @{
            int i = 0;
        }
        @foreach (var tier in @Model.LocationServicePrices)
        {
            <div class = "form-group">
                <label>@tier.PricingTierName</label>
                <input class = "form-control" type = "text" asp-for = "@tier.PricePerUnit"
                       name = "LocationServicePrices[@i].PricePerUnit" data-rule-number = "true" data-rule-min = "0" data-rule-max = "7">
            </div>
            i++;
        }
    </form>
</div>

@section Scripts
{
    <script>
        var formData = {};
        $('form[name = "ServicePriceInformationsForm"]').serializeArray().forEach(function (item) {
            formData[item.name] = item.value;
        });

        // Convert LocationServicePrices data to JSON array
        formData["LocationServicePrices"] = [];
        $('.form-group input[id$ = "PricePerUnit"]').each(function () {
            formData["LocationServicePrices"].push({ "PricePerUnit": $(this).val() });
        });

        console.info(formData)
        console.info(JSON.stringify(formData))
    </script>
}

Привет @Eu, я вижу твою новую ветку, если твоя строка json if:{ "Id": "", "ServiceId": "2031", "LocationId": "2", "MaterialUomId": "6", "Cost": "123", "LocationServicePrices": { "0.PricePerUnit": "1", "1.PricePerUnit": "2", "2.PricePerUnit": "3", "3.PricePerUnit": "4", "4.PricePerUnit": "5" } }, это неправильно, тебе нужно поделиться своим методом serializeFormToObject.

Rena 09.04.2024 03:54

Я обновил свой пост, добавив код метода serializeFormToObject . Я попробовал ваш код и получил это { "0.PricePerUnit": "1", "1.PricePerUnit": "2", "2.PricePerUnit": "3", "3.PricingTierId": "9", "3.PricePerUnit": "4"} в LocationServicePrices

Eugene Sukh 09.04.2024 09:46

Привет @EugeneSukh, serializeJSON также не является функцией build-injs/jqeury. Вам лучше поделиться достаточным количеством кода. Вы пытались жестко закодировать переменную servicePrice с помощью моей общей правильной строки jsong? Можете ли вы сначала попробовать и проверить, может ли он пройти на серверную часть и получить соответствующее значение?

Rena 09.04.2024 10:12

Я попытался добавить вашу строку JSON, и да, она работает правильно. Как я могу воспроизвести это в коде?

Eugene Sukh 09.04.2024 19:41

Привет @EugeneSukh, как я уже говорил, ваша строка json преобразуется с помощью функции:serializeFormToObject, затем вы делитесь этой функцией. Но в вашей функции она все еще содержит пользовательскую функцию или, возможно, функцию сторонней библиотеки:serializeJSON, вам нужно поделиться достаточным количеством кода.

Rena 10.04.2024 03:00

Как я могу правильно сериализовать без этой функции?

Eugene Sukh 10.04.2024 08:08

Привет @Eugene Sukh, проверьте мой обновленный ответ.

Rena 16.04.2024 03:49

Другие вопросы по теме

Похожие вопросы

Java Script для интернет-теста скорости HTML и JS, неправильная структура
Функция Javascript не работает с двузначными числами
VueUse useIntersectionObserver и rootMargin, срабатывающий задолго до того, как элемент окажется в пределах диапазона
Невозможно подключиться к веб-сокету из Javascript, даже если я могу с помощью Postman
Необнаруженная ошибка: не удалось найти соответствующий маршрут при перенаправлении на страницу /login после выхода из системы
Нажатие кнопки согласия с кукловодом
Ограничить диапазон от начала до конца при проверке Joi
Как предотвратить создание новых текстовых узлов после нажатия клавиши «Ввод» в элементе contenteditable?
Надежно сжимайте строку из единиц и нулей в строку меньшего размера и преобразуйте ее обратно в точно такую ​​же строку. Каждый раз
Как установить примечание к ячейке Google Таблиц на основе значения ячейки, которое начинается со знака плюс