Asp.net mvc 4 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

首先感谢你抽出时间阅读这篇文章

我一直在构建我的第一个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; }
        [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时,代码甚至不会到达控制器以在断点处停止。看到我原来的问题,我已经发布了一个编辑与您建议的修改。