Asp.net mvc 4 POST控制器值始终为空
首先感谢你抽出时间阅读这篇文章 我一直在构建我的第一个asp.net 4.5 MVC4 Web Api,但在controll POST方法中收到的值始终为空 为了测试PostAPI方法,我尝试了Fiddler和Google Chrome Simple REST Clinet,但结果总是一样的 这是我的密码: 控制器(POST) 模型类Asp.net mvc 4 POST控制器值始终为空,asp.net-mvc-4,asp.net-web-api,asp.net-4.5,asp.net-web-api2,Asp.net Mvc 4,Asp.net Web Api,Asp.net 4.5,Asp.net Web Api2,首先感谢你抽出时间阅读这篇文章 我一直在构建我的第一个asp.net 4.5 MVC4 Web Api,但在controll POST方法中收到的值始终为空 为了测试PostAPI方法,我尝试了Fiddler和Google Chrome Simple REST Clinet,但结果总是一样的 这是我的密码: 控制器(POST) 模型类 public class Terminal { public int Id { get; set; } [Requ
public class Terminal
{
public int Id { get; set; }
[Required]
public int TerminalId { get; set; }
[Required]
public string Tag { get; set; }
[Required]
public DateTime TagDate { get; set; }
}
POST
http://localhost:52036/api/terminal/
在上述代码中,POST方法终端中接收的值始终为空
下面是我一直在使用Fiddler发布的命令:
方法:
职位
地址:
http://localhost:52036/api/terminal
Content-Type: application/json
Host: localhost:52036
Content-Length: 60
{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}
标题:
http://localhost:52036/api/terminal
Content-Type: application/json
Host: localhost:52036
Content-Length: 60
{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}
正文:
http://localhost:52036/api/terminal
Content-Type: application/json
Host: localhost:52036
Content-Length: 60
{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}
-----------编辑-13-04-2014 14:56-----------------
我已经修改了我的Fiddler http post请求,正如在对这个问题的一些答复中建议的那样,并提供了以下详细信息。然而,当在VS2013调试模式下进行测试时,我不断收到一个500 HTTP错误,我的API代码甚至没有到达控制器
地址
public class Terminal
{
public int Id { get; set; }
[Required]
public int TerminalId { get; set; }
[Required]
public string Tag { get; set; }
[Required]
public DateTime TagDate { get; set; }
}
POST
http://localhost:52036/api/terminal/
标题
Content-Type: application/json; charset=utf-8
Host: localhost:52036
Content-Length: 62
身体
{"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"}
------编辑2014年4月13日20:38------------
好的,使用Google的Chrome REST客户端,我注意到以下返回错误消息:
{“Message”:“发生了错误。”,“ExceptionMessage”:“属性”
类型“ClockingDemo.Models.Terminal”上的“TerminalId”无效。
标记为[Required]的值类型属性也必须标记为
[数据文件(IsAdvest-true)]被认为是必需的。
使用[DataContract]和属性为声明类型赋值
具有
[DataMember(IsRequired=true)],“ExceptionType:“System.InvalidOperationException”,“StackTrace:”
在
System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata
元数据,对象容器)\r\n位于
System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata
元数据,ValidationContext ValidationContext,对象容器)\r\n在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据,ValidationContext ValidationContext,对象容器)\r\n
在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata 元数据,ValidationContext ValidationContext)\r\n位于 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据,ValidationContext ValidationContext,对象容器)\r\n
在 System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象 模型、类型、模型metadataProvider metadataProvider、, HttpActionContext actionContext,字符串keyPrefix)\r\n位于 System.Web.Http.ModelBinding.FormatterParameterBinding.c__DisplayClass1.b__0(对象 模型)\r\n位于 System.Threading.Tasks.TaskHelperExtensions.c\uuU DisplayClass36
1.c\uU DisplayClass38.b\uU 35()\r\n
在
System.Threading.Tasks.TaskHelperExtensions.c\uu DisplayClass49.b\uu 48()\r\n
在System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func
1
func,CancellationToken CancellationToken)“}
我认为问题在于我的INTEGER属性TerminalId被定义为[必需]。我觉得设置不可为null的属性和[必需]可能会有问题
非常愿意接受建议
--------------答案-------------------
我终于偶然发现了这条线索,它为我解决了这个问题。
只需将其粘贴到Global.asax文件中:
GlobalConfiguration.Configuration.Services.RemoveAll(
typeof(System.Web.Http.Validation.ModelValidatorProvider),
v => v is InvalidModelValidatorProvider);
如果您认为有更好的方法,我仍然愿意接受其他解决方案。在Fiddler中,您必须使用下面的方法 您的请求主体应该是这样的{“TerminalId”:123,“Tag”:“222”,“TagDate”:“2014-04-13 04:22:12”}
在请求头中,您需要传递如下内容类型content-type:application/json;charset=utf-8在我的例子中,我有一个混合的ASP.NET Web表单和MVC和Web API 就是这样解决的:
public HttpResponseMessage PostTerminal(JObject jsonMessage)
{
var terminal = jsonMessage.ToObject<Terminal>();
if (terminal == null)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, terminal);
}
...
}
公共HttpResponseMessagePostTerminal(JObject jsonMessage)
{
var terminal=jsonMessage.ToObject();
如果(终端==null)
{
返回请求.CreateResponse(HttpStatusCode.BadRequest,终端);
}
...
}
参考资料:与论坛网站不同,我们不会在网站上使用“谢谢”或“感谢任何帮助”或签名。请参阅。注意。(我应该说谢谢你指出这一点吗?)与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。请参阅。不幸的是,这仍然不起作用@Naveen。我一直收到500个错误。在调试模式下运行API时,代码甚至不会到达控制器以在断点处停止。看到我原来的问题,我已经发布了一个编辑与您建议的修改。