В представлении я создаю проект. В форму заполняю данные проекта. В проекте есть службы, и для них я использую модальную форму 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; }
}

как насчет попробовать
[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>
если это не сработало, но решение xings помогло, вы можете удалить правильную проверку из этого ответа и поставить ее на xings.
Поскольку вы добавляете атрибут [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.
К сожалению, это тоже не сработало. Однако я попытался удалить [ValidateAntiForgeryToken], и тогда все работает нормально.