Действие вашего контроллера:
public IActionResult AmendPortingData(string json)
ожидает параметр с именем json
.
Когда вы вызываете это с помощью:
$.ajax({ url: url, data: "string" });
передаваемые данные не имеют имени параметра, поэтому связыватель моделей по умолчанию не может определить, какую часть данных применить к этому параметру.
Это работает с:
http://url?json=string
, так как вы указываете имя параметра ?json=
, если вы вызвали свое действие с помощью
http://url/string
, то оно снова не распознало бы"string", как для параметра "json" и не работает (хотя, вероятно, даст вам более полезную ошибку "не могу найти данные для параметра") (конечно, при условии отсутствия дополнительной маршрутизации).
Предоставляястроковый параметр имя, связыватель модели по умолчанию сможет сопоставить строку с именем параметра:
$.ajax({ url: url, data: { json: "string" }});
Альтернативой является добавление связывателя модели, который будет принимать любую строку POST ипередайте его одному параметру - но вышеупомянутое, как правило, чище и проще в обслуживании.
Добавление [HttpPost]
ограничивает действие только этим глаголом (поэтому, кроме этого, добавление [HttpPost][HttpGet]
делаетэто непригодно какэто должно быть POST и GET).
Если вы строите свою форму из модели представления, то вы можете использовать эту модель непосредственно в действии:
public ActionResult MyAction(MyViewModel viewmodel)
и передайте напрямую:
$.ajax({ url: url, data: $("form").serialize() });
, и связыватель моделей по умолчанию сопоставит имена ваших входных данных со свойствами в модели представления.