我试图在角色表单上发布一些JSON数据到我的ASP.NET5 MVC6 Controller操作。模型绑定器似乎不起作用。不知道我在这里失踪了什么。
我的ASP控制器:
public class DefaultController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult SubmitTest(QTestViewModel model)
{
return Json("true");
}
}
My Angular Controller:
angular.module("testActiveMq", [])
.controller("MqTestController", ["$scope", "$http", function ($scope, $http) {
// Submit Form
$scope.submitForm = function () {
debugger;
var formData = (this.data) ? angular.toJson(this.data) : null;
if (formData && this.qForm && this.qForm.$valid) {
$http({
url: "/Default/SubmitTest",
data: formData,
method: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8"
})
.then(function successCallback(response) {
debugger;
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
debugger;
// called asynchronously if an error occurs
// or server returns response with an error status.
});
}
};
}])
我的视图模型:
public class QTestViewModel
{
public string MqBrokerUri { get; set; }
public string ClientId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int TotalRequests { get; set; }
public int MaxConcurrentRequests { get; set; }
public int DelayBetweenThreads { get; set; }
}
当我发出请求时,HTTP标头是..
POST /Default/SubmitTest HTTP/1.1
Host: localhost:50877
Connection: keep-alive
Content-Length: 225
Accept: application/json, text/plain, */*
Origin: http://localhost:50877
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:50877/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
我的表单数据如此......
{"MqBrokerUri":"ssl://broker-uri:1616?transport.acceptInvalidBrokerCert=true","ClientId":"MqLoadTest","UserName":"myunm","Password":"mypwd","TotalRequests":100,"MaxConcurrentRequests":10,"DelayBetweenThreads":1}
我觉得我错过了一些非常明显的东西。为什么我的JSON数据不能绑定到我的模型?当然,我不需要为这么简单的东西定制模型粘合剂吗?
答案 0 :(得分:12)
在MVC 5及更早版本中,您的代码足以在控制器中接收模型。
但是在MVC 6中,您还需要在控制器操作中设置[FromBody]
参数:
[HttpPost]
public IActionResult SubmitTest([FromBody]QTestViewModel model)
{
return Json("true");
}
不确定为什么这是MVC 6中的要求,但如果您不添加FromBody属性,您的模型将保留其默认值。
例如,检查官方文档中的Web API tutorial。
在深入挖掘源代码后,似乎BodyModelBinder
只会接受专门启用 body 绑定源的模型,这样做会添加[FromBody]
属性。
var allowedBindingSource = bindingContext.BindingSource;
if (allowedBindingSource == null ||
!allowedBindingSource.CanAcceptDataFrom(BindingSource.Body))
{
// Formatters are opt-in. This model either didn't specify [FromBody] or specified something
// incompatible so let other binders run.
return ModelBindingResult.NoResultAsync;
}
PS。 Angular默认是字符串化json对象,但如果你使用类似jQuery的东西,你还需要手动调用JSON.stringify
。
答案 1 :(得分:1)
有时候json更好地使用它
var jsonResult=json("true");
jsonResult.maxJsonLength=int32.maxValue
return jsonresult;
希望它对你有所帮助。
答案 2 :(得分:1)
[edit]看来这个答案是不正确的。我的问题是由Action参数命名与对象的一个属性相同。这导致MVC使用前缀来防止歧义。我不同意这是不明确的,我在Github讨论这个问题。
我刚刚在Github上记录了一个错误。看来如果你的参数没有被命名为参数类型的CamelCase,那么它希望有效载荷中的字段以参数名称作为前缀。
您可以通过在Action的参数之前添加[Bind(Prefix =“”)]来解决此问题。
public IActionResult SubmitTest([Bind(Prefix="")]QTestViewModel model)
答案 3 :(得分:0)
好的@Daniel J.G.答案对我不起作用 我不得不使用 [FromForm]代替[FromBody]让binging工作
[HttpPost]
public IActionResult SubmitTest([FromForm]QTestViewModel model)
{
return Json("true");
}