angularサービスでasp.net、mvc6、angularjsを使用してアプリケーションを開発しています。アクションメソッドにリクエストを送信すると、渡されたデータがありません。リクエストを確認すると、次の原因による例外が表示される場合があります。
- フォーム '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest)this.Request).Form'は、タイプ 'System.InvalidOperationException'の例外をスローしましたMicrosoft.AspNet.Http.IFormCollection {System.InvalidOperationException}
"Incorrect Content-Type:application/json;charset=UTF-8"
という例外メッセージ
my angular service
return $http({ method: 'POST', url: 'home/createEvent', eventDetails: event })
.success(function(data, status, headers, config) {
return data;
})
.catch(function(data, status, headers, config) {
console.log(data);
});
私のコントローラーで
[HttpPost]
public IActionResult CreateEvent([FromBody]Event eventDetails)
{
return Json(new {dsd=""},
new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});
}
次の例がお役に立てば幸いです。
コントローラーを飾ってみてください
[Produces("application/json")]
[Route("api/[controller]")]
コントローラー名を表示しなかったので、架空の完全な実例を示します。
[Produces("application/json")]
[Route("api/[controller]")]
public class DashBoardLayoutApi : Controller
{
public DashBoardLayoutApi()
{ }
[HttpPost]
public void Post([FromBody] LoginViewModel data)
{ }
}
public class LoginViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
<script>
var data = {
Email: 'Test',
Password: 'Test',
RememberMe: true
};
$("#test").click(function() {
$.ajax({
url: '/api/DashBoardLayoutApi',
type: 'POST',
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(data),
});
}
</script>
<button id="test"> Save Layout</button>
受け入れられた答えは私にはうまくいきませんでした。私にとっての解決策は、$ http呼び出しにヘッダーを追加することでした。
$http({
url: "/install",
method: "POST",
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})
.success(...);
私の場合、[Produces("application/json")]
を追加しても何もしませんでしたが、[FromBody]
属性の属性は、トリックをしたものです!
隠された答えは素晴らしいです。ただし、アプリケーションに非表示のアプローチを実装した後でも、C#コントローラーには空のモデルがありました。少し掘り下げてみると、問題はJSコードで作成された不正なクライアントモデルにあり、サーバーでデシリアライズできません(nullをGuid型に変換することはできません)。
何らかの理由で、このような場合、モデルバインダーは例外をスローしません。 https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/model-binding
パラメーターがバインドされると、モデルバインドはその名前の値の検索を停止し、次のパラメーターのバインドに進みます。バインドが失敗した場合、MVCはエラーをスローしません。 ModelState.IsValidプロパティを確認することにより、モデル状態エラーを照会できます。
したがって、C#コントローラーのModelState.IsValidプロパティをチェックして、有効なモデルに合格したことを確認し、カスタムモデルバインダーを使用してモデルバインディングエラーをキャッチしてログに記録することを検討してください。