質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

16946閲覧

(Ajax)Postでdataを送っていますが、サーバーのコントローラーで受け取ることができない

ryu_k

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/06/03 07:13

編集2020/06/03 07:19
環境

.Core3.1 
C#

現象

Ajax の Post でクライアントからJsonデータを送り、サーバー側のWebAPIコントローラーでそのJsonデータを受け取りたいのですが、データがnullになって困っています。

同様の質問を確認して試行錯誤しているのですが成功しないため、どなたかお知恵をお借りしたいです。

クライアントからの送信データ
{ str : "ABC" }

下記にあるようにプログラムし、
Getメソッドでは、サーバー側で値の取得に成功しましたが、
Postメソッドでは、サーバー側メソッドの引数がnullになってしまいます。

ためしたプログラム(サーバー側)

C#

1[Route("api/Test")] 2[ApiController] 3public class TestController : ControllerBase 4{ 5 [HttpGet("get1")] 6 public string GetData([FromQuery] string str) 7 { 8 Debug.WriteLine(str); 9 return ""; 10 } 11 12 [HttpPost("post1")] 13 public void PostData(string str) 14 { 15 Debug.WriteLine(str); 16 } 17}

ためしたプログラム(クライアント側)

C#

1/* テスト用Getメソッド */ 2function button_get_click() { 3 var pUrl = "/api/Test/get1"; 4 5 $.ajax({ 6 type: "GET", 7 url: pUrl, 8 cache: false, 9 dataType: "json", 10 data: { str : "ABC" }, 11 async: false, 12 success: function (data) { 13 console.log("success"); 14 } 15 }); 16}; 17 18/* テスト用Postメソッド */ 19function button_post_click() { 20 var pUrl = "/api/Test/post1"; 21 22 $.ajax({ 23 type: "POST", 24 url: pUrl, 25 cache: false, 26 contentType: 'application/json', 27 dataType: "json", 28 data: JSON.stringify({ str: "ABC" }), 29 //data: { str: "ABC" } ←これでもやはりnullでした 30 async: false, 31 success: function (data) { 32 console.log("success"); 33 } 34 }); 35};

◆Postもサーバー側には到達しているのですが、引数がnullになってしまいます。

◆ブラウザ(Edge)でF12を押し、ネットワークの要求本文には「{"str":"ABC"}」が設定されていることを確認しました。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/03 07:16

ASP.NET の話であれば ASP.NET のタグをつけてください。
ryu_k

2020/06/03 07:19

ありがとうございます。タグをつけました。
guest

回答1

0

ベストアンサー

自分が試した限りですが、Core 版では以下の記事のようにコンプレックス型をアクションメソッドの引数に渡さないとダメでした。

ASP.NET Core 3.1 Web API
http://surferonwww.info/BlogEngine/post/2020/05/15/aspnet-core-3-web-api.aspx

ちなみに上の記事でコンプレックス型というのは以下のような Hero クラスのことです。

namespace WebAPI.Models { public class Hero { public int Id { get; set; } public string Name { get; set; } } }

コンプレックス型を定義して渡してみてください。

Core 版も同じかどうか不明ですが、.NET Framework 版の Web API では string などのプリミティブ型をアクションメソッドの引数にした場合、引数に属性が付与されてなければクエリ文字列からパラメータを探してモデルバインディングします。

属性を付与して、

[FromBody] string name

・・・のようにすればボディから探しますが、その場合でも jQuery ajax の data に "name=value" と設定してはダメで、"=value" としないと引数 name にはバインドされません。わけが分からないのですが、何にせよそういうウラワザ的なことは避けた方がよさそうです。

投稿2020/06/03 07:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryu_k

2020/06/03 08:27

実現できました! ご教示いただいたとおりに、クラスを定義し値が設定されることが確認できました。 コンプレックス型、理解できました! とても助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問