我正在使用asp.net,mvc6和angularjs在我的角度服务上开发一个应用程序。当我向动作方法发出请求时,我没有传递数据。 当我检查了请求时,我可以看到由以下原因引起的异常:
- Form'((Microsoft.AspNet.Http.Internal.DefaultHttpRequest)this.Request).Form' 抛出了类型的例外 'System.InvalidOperationException'Microsoft.AspNet.Http.IFormCollection {System.InvalidOperationException}
异常消息"Incorrect Content-Type:application/json;charset=UTF-8"
我的角色服务
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()});
}
答案 0 :(得分:6)
希望以下示例可以帮助您。
尝试使用
装饰您的控制器[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>
答案 1 :(得分:4)
接受的答案对我没有用。对我来说,解决方案是在$ http调用中添加标题:
$http({
url: "/install",
method: "POST",
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})
.success(...);
答案 2 :(得分:0)
隐藏的答案很棒。但是,即使我在我的应用程序中实现了隐藏的方法,我仍然在C#控制器中有空模型。在挖掘了一下后,我发现问题出在JS代码中创建的不正确的客户端模型中,无法在服务器上反序列化(null无法转换为类型Guid)。
出于某种原因,模型绑定器在这种情况下不会抛出异常: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
绑定参数时,模型绑定将停止查找具有该名称的值,并继续绑定下一个参数。如果绑定失败,MVC不会抛出错误。您可以通过检查ModelState.IsValid属性来查询模型状态错误。
因此,检查C#控制器中的ModelState.IsValid属性以确保传递了有效模型,并考虑使用自定义模型绑定器来捕获模型绑定错误并记录它们。
答案 3 :(得分:0)
在我的情况下,添加[Produces("application/json")]
并没有任何作用,但是在参数中添加[FromBody]
属性是解决问题的方法!