Форма публикации с XmlHttpRequest / ajax изменяет полезную нагрузку - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу Post форму, используя Ajax/XMLHttpRequest до ASP NET Core Controller.
Если я просто Post форма, она получает данные прямо в Controller, но при использовании XMLHttpRequest полейиз моих model получить значения по умолчанию:

Я включил в свой код следующие 2 формы: одну форму, которая просто Posts до url, указанную в атрибуте action, и другую, котораявызывает method и Post -с с XMLHttpRequest.

HTML + JS

<!DOCTYPE html>
<html>

<head>
    <script>
        window.submit = function () {
            var form = document.getElementById("delegate-form");
            var data = new FormData(form);
            var xhr = new XMLHttpRequest();

            var content=form.getAttribute('Content-Type');
            var method=form.getAttribute('method');
            var action=form.getAttribute('action');
            xhr.open(method,action);
            xhr.setRequestHeader('Content-Type',content);
            xhr.onload = function () {
                if (xhr.status == 200) {
                    resolve(xhr.response);
                }
                else if (xhr.status != 200) {
                    reject("Failed to submit form with status" + xhr.status);
                }
            }
            xhr.send(data);
        };


    </script>
</head>

<body>
    <div id="Form-without-ajax">
        <form method="POST" enctype="multipart/form-data" action="http://localhost:8300/api/bulk">
            <input type="text" name="Name" value="aa" />
            <input type="text" name="ID" value="13"/>
            <input type="file">
            <br>
            <input style="align-content: flex-end" type="submit" />
        </form>
    </div>
    <br>

    <div id="Form-with-ajax">
        <form method="POST" id="delegate-form" enctype="multipart/form-data" action="http://localhost:8300/api/bulk">
            <input type="text" name="Name" value="ab" />
            <input type="text" name="ID"  value="33"/>
            <input type="file">
            <br>

        </form>
        <button onclick="submit()">Submit with delegate</button>
    </div>

</body>

</html>

Модель

 [Serializable]
    public class Data {
        public string Name { get; set; }
        public int ID { get; set; }
        }
    }

.NET Controller

    [HttpPost]
    [Route("/api/bulk")]
    public async Task TestBulkAsync(Data data) {
        //data has Name=null and id=0 when using the XMLHttpRequest
    }

PS Я использую multipart/form-data, потому что я хочу прикрепить некоторые файлы, помимо этой модели. Имне нужен обработчик, как в моем случае submit, потому что мне нужно выполнить дополнительную логику перед отправкой формы.

1 Ответ

0 голосов
/ 25 февраля 2019
xhr.setRequestHeader('Content-Type',content);

Обычно, если вы передадите объект FormData в XMLHttpRequest, он сгенерирует заголовок Content-Type (который будет составным запросом с определенным атрибутом границы) из объекта FormData.

Здесь вы переопределяете тип контента на тот, который вы определяете вручную… и вы пропускаете атрибут границы.Сервер не знает, где находятся границы, и все ломается.

Не переопределяйте Content-Type.

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