Отправка Fom возвращает статус 400

В представлении я создаю проект. В форму заполняю данные проекта. В проекте есть службы, и для них я использую модальную форму jQuery для операций CRUD в службах. Для операций CRUD я использую AJAX. В этом представлении у меня есть 2 частичных представления: для формы, в которой я ввожу данные службы, и еще одно частичное представление для обновления данных службы. Операции CRUD работают, и я могу создать, обновить или удалить службу. Я могу сделать это без создания проекта. Однако, когда я нажимаю кнопку «Отправить», чтобы создать проект, похоже, что правильный метод не вызывается, и я не могу создать проект, я просто получаю белый экран. URL-адрес такой же, как и URL-адрес, по которому я заполняю форму проекта localhost:/Project/Create. Я попытался удалить jQuery, где я добавляю службу с помощью AJAX, а затем похоже, что данные передаются правильному методу в контроллере проекта. В чем причина этого - почему я не могу обработать данные формы, когда есть код jQuery?

Я попытался изменить вызов AJAX (он всегда работает, и я могу создать службу), а также BigViewModel (как предлагается здесь - Передача нескольких моделей из представления в контроллер в asp MVC 5), но это все еще не работает...

Вот метод в контроллере:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(ProjectViewModel model)
{

    int audianceId = model.ProjectModel.AudienceId;
    int categoryId = model.ProjectModel.CategoryId;
    //...............................................
    //CREATE THE PROJECT AND ADD TO DATABASE
 }

Вот вызов AJAX (из представления) при создании службы:

<script>
    var name = $("#ServiceModel_Name").val();
    var price = $("#ServiceModel_Price").val();
    var discount = $("#ServiceModel_Discount").val();
    var quantity = $("#ServiceModel_Quantity").val();
    var description = $("#ServiceModel_Description").val();
    var ir = $("#ServiceModel_IR").val();

    var details = { "name": name, "quantity": quantity, "price": price, "discount": discount, "description": description, "ir": ir };
    $.ajax({
        type: "POST",
        url: "/Project/RegisterService",
        data: details,
        datatype: "json",
        async: "true",
        success: function (response) {
            var serviceId = response;                
            $("#confirmationMessage").text("Service successfully created!");
            $(function () {
                $("#dialogMessage").dialog({
                        modal: true,
                        title: "Success!",
                        buttons: {
                            Ok: function () {
                                    $(this).dialog("close");
                                    //BindData(response);
                                    //ClearForm();
                                    $("#service1").dialog("close");
                            }
                        }
                });
            });
        },
        error: function (response) {
            alert(response.status + ' ' + response.statusText);
        }
    });
</script>

И определение ProjectViewModel:

 public class ProjectViewModel
    {
        public CreateProjectViewModel ProjectModel { get; set; }

        public CreateServiceViewModel ServiceModel { get; set; }
    }
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
0
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

как насчет попробовать

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([FromBody] ProjectViewModel model)
{

    int audianceId = model.ProjectModel.AudienceId;
    int categoryId = model.ProjectModel.CategoryId;
    //...............................................
    //CREATE THE PROJECT AND ADD TO DATABASE
    return CreatedAtAction("Create", model);
 }


<script>
    var name = $("#ServiceModel_Name").val();
    var price = $("#ServiceModel_Price").val();
    var discount = $("#ServiceModel_Discount").val();
    var quantity = $("#ServiceModel_Quantity").val();
    var description = $("#ServiceModel_Description").val();
    var ir = $("#ServiceModel_IR").val();

    var details = { "name": name, "quantity": quantity, "price": price, "discount": discount, "description": description, "ir": ir };
    $.ajax({
        type: "POST",
        url: "/Project/RegisterService",
        data: JSON.stringify(details),
        datatype: "json",
        contentType:"application/json; charset=utf-8",
        async: "true",
        success: function (response) {
            var serviceId = response;                
            $("#confirmationMessage").text("Service successfully created!");
            $(function () {
                $("#dialogMessage").dialog({
                        modal: true,
                        title: "Success!",
                        buttons: {
                            Ok: function () {
                                    $(this).dialog("close");
                                    //BindData(response);
                                    //ClearForm();
                                    $("#service1").dialog("close");
                            }
                        }
                });
            });
        },
        error: function (response) {
            alert(response.status + ' ' + response.statusText);
        }
    });
</script>

К сожалению, это тоже не сработало. Однако я попытался удалить [ValidateAntiForgeryToken], и тогда все работает нормально.

Ivan 30.04.2019 18:54

если это не сработало, но решение xings помогло, вы можете удалить правильную проверку из этого ответа и поставить ее на xings.

Bryan Dellinger 30.04.2019 18:57
Ответ принят как подходящий

Поскольку вы добавляете атрибут [ValidateAntiForgeryToken] к своему действию публикации, вам необходимо отправить RequestVerificationToken из заголовков, если вам нужно добавить проверку против подделки.

1. Добавьте @Html.AntiForgeryToken() в код формы.

2.Добавьте заголовок в свой ajax:

$.ajax({
    type: "POST",
    url: "/Project/RegisterService",
    data: details,
    headers: {
        RequestVerificationToken:
            $('input:hidden[name = "__RequestVerificationToken"]').val()
    }, 
    async: "true",
    success: function (response) {

    }       
});

dataType — это то, что вы ожидаете от сервера: json, html, текст и т. д. jQuery будет использовать это, чтобы выяснить, как заполнить параметр функции успеха.

Кроме того, убедитесь, что ваши данные ajax соответствуют параметрам действия.

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult RegisterService(Project model)

Благодарю за ваш ответ. Код jQuery, который я использую, работает нормально, и я могу создать Сервис, однако я не могу создать проект, что должна делать форма, которую я пытаюсь отправить. Итак, в форме проекта у меня есть другая форма, которая создает службу. Когда я удаляю код jQuery, создающий службу, я могу отправить данные проекта, но когда я снова добавляю файл jQuery.

Ivan 30.04.2019 18:21

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