アクションは次のようなものです。
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Update(int id, string userName, string firstName, string lastName, string email, string role, string returnUrl = null)
{
...
}
アプリをデバッグすると、リクエストでnullでなくても、メソッドの本体でパラメーターは常にnullになります。
0%5Bid%5D=10&1%5BuserName%5D=Mike99&2%5BfirstName%5D=Mike&3%5BlastName%5D=Johnson&4%5Bemail%5D=mike.johnson%40live.com&5%5Brole%5D=user
ルーティング構成:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
};
リクエストはAjaxによって行われます:
$.post("/Users/Update", postData)
.done(function (data) {
row.find(".changed").attr('class', 'editable');
dataTable.draw();
});
Postmanでヒットすると、アクションは正しいデータを取得するようです。jQueryによって送信されるデータが気に入らないだけです。
したがって、問題は次のようになります。AJAXによって送信されたデータを適切にフォーマットする方法は?
Postmanから送信されたデータ:
id=10&userName=Mike99&firstName=Mike&lastName=Johnson&email=mike.johnson%40mail.com&role=user
AJAXによって送信されたデータと比較してください。
0%5Bid%5D=10&1%5BuserName%5D=Mike99&2%5BfirstName%5D=Mike&3%5BlastName%5D=Johnson&4%5Bemail%5D=mike.johnson%40live.com&5%5Brole%5D=user
postData
を使用すると、次のようになりますconsole.log(postData)
。
{0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}}
0: {id: 10}
1: {userName: "Mike99"}
2: {firstName: "Mike"}
3: {lastName: "Johnson"}
4: {email: "[email protected]"}
5: {role: "user"}
postData
構築方法は次のとおりです。
var row = $(this).parents("tr");
var id = [{ id: dataTable.row(row).data().Id }];
divFields = row.find("div.editable").map(function () {
var value = this.className === "editable changed" ? this.innerText : null;
return {
[this.dataset.name]: value
}
}).get();
selectFields = row.find("select.editable").map(function () {
var value = this.className === "editable changed" ? $(this).find(":selected").text() : null;
return {
[this.dataset.name]: value
}
}).get();
var fields = id.concat(divFields.concat(selectFields));
var postData = Object.assign({}, fields);
あなたの例でfields
は、フォームの値を表す配列を作成しています。これは、次のようになります。
[
{ id: 10 },
{ userName: "Mike99" },
{ firstName: "Mike" },
{ lastName: "Johnson" },
{ email: "[email protected]" },
{ role: "user" }
]
を使用するとObject.assign({}, fields)
、のプロパティをfields
新しいオブジェクトにコピーすることになりますが、これらのプロパティは0 ... 5です。これは、次のようなオブジェクトになってしまうことを意味します。
{
0: { id: 10 },
1: { userName: "Mike99" },
2: { firstName: "Mike" },
3: { lastName: "Johnson" },
4: { email: "[email protected]" },
5: { role: "user" }
}
これがjQueryによってapplication/x-www-form-urlencoded
コンテンツタイプにシリアル化されると、ASP.NETCoreモデルバインダーでは解析できないものになります。あなたはすでにそれがどのように見えるかを質問に含めているので、ここでは繰り返しません。
(多くの可能性のある)1つの解決策...
はfields
、次のように、でスプレッド演算子()を使用することです。
Object.assign({}, ...fields)
これfields
は、含まれている個々のオブジェクトに分割され、結果のオブジェクトに割り当てられます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加