Вы, как правило, похожи на отправку данных в неправильном формате, который неожиданно интерпретируется как другой метод с другими параметрами (которых никогда не существует) или приводит к ошибке при привязке данных к нужным типам данных. Например, вы отправляете следующие данные:
var vm = {
id: 123
};
Ожидаемая конечная точка API
GET /account/update-customer/123 // OK 200
Фактический URL отправлен
// Url encoded. This method expects an integer as parameter but string was passed.
GET /account/update-customer/vm%5Bid%5D=123 // Internal Server Error 500
Так что, если вы отправляете их как данные формы , удалите фигурные скобки из объекта vm
(поскольку он уже является объектом в любом случае), чтобы HTTP правильно выпекал их в URL, или просто дайте jQuery serialize
данные для вас и без проблем (вы, вероятно, должны это сделать) .
Вот полные фрагменты в действии, а также мои маленькие рекомендации по рефакторингу:
Вы, вероятно, уже делаете это, но используете Html.BeginForm
, который позволяет получить URL-адрес API более удобным способом на более позднем этапе (например, в вызовах AJAX).
Переключение с
<form id="idk">
<div class="form-group">
@Html.LabelFor(m => m.Customer.Name)
@Html.TextBoxFor(m => m.Customer.Name, new { @class = "form-control", @id = "customername" })
@Html.ValidationMessageFor(m => m.Customer.Name)
</div>
[...]
К
@using (Html.BeginForm("UpdateCustomer", "Account"))
{
<div class="form-group">
@Html.LabelFor(m => m.Customer.Name)
@Html.TextBoxFor(m => m.Customer.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Customer.Name)
</div>
[...]
<!-- No need for manually specifing the id here since it will be taken care of by the framework -->
@Html.HiddenFor(m => m.Customer.Id)
}
Файл Javascript
$("form#idk").submit(function (e) {
e.preventDefault();
//var vm = {
// id: $("#id").val(),
// Name: $("#customername").val(),
// IsSubscribedToNewsLetter: $("#subscribename").val(),
// MembershipTypeId: $("#membershipname").val(),
// BirthDate: $("#birthdate").val(),
// Irresponsible: $("#irresponsiblename").val(),
// Id: $("#id").val()
//};
// This one-liner should do the magic for you
var vm = $(this).serialize();
$.ajax({
// Made available by the above Html.BeginForm().
// This way, when you decide to change the URL later, you won't have to deal
// with having to possibly update this in multiple places
url: this.action,
method: "PUT",
data: vm,
success: function (data) {
// ...
}
});
});
Надеюсь, это поможет.