POST控制器值始终为NULL

时间:2014-04-13 03:42:50

标签: 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方法中收到的值总是为NULL。

为了测试POST api方法我尝试过Fiddler和Google Chrome Simple REST Clinet,但结果总是一样。

这是我的代码:

控制器(POST)

    // POST api/Terminal
    public HttpResponseMessage PostTerminal(Terminal terminal)
    {
        if (terminal == null)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest, terminal);
        }

        if (ModelState.IsValid)
        {
            db.Terminals.Add(terminal);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, terminal);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = terminal.Id }));
            return response;
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }

模型类

    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方法终端中收到的值始终为NULL。

以下是我使用Fiddler进行POST的命令:

方式: POST

地址:

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代码甚至无法访问控制器。

地址

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"}

--------------编辑13/04/2014 20:38 -----------------

好的,使用Google的Chrome REST客户端,我注意到以下返回错误消息:

  

{“消息”:“发生了错误。”,“ExceptionMessage”:“属性   'ClockingDemo.Models.Terminal'类型的'TerminalId'无效。   标记为[必需]的值类型属性也必须标记为   [DataMember(IsRequired = true)]被识别为必需。考虑   使用[DataContract]和属性归因声明类型   同   [数据成员(IsRequired =真)] “” ExceptionType。 “:” System.InvalidOperationException “ ”堆栈跟踪“:”   在   System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata   元数据,对象容器)\ r \ n at   System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata   metadata,ValidationContext validationContext,Object container)\ r \ n
  在   System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata   metadata,ValidationContext validationContext,Object container)\ r \ n
  在   System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata   元数据,ValidationContext validationContext)\ r \ n at   System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata   metadata,ValidationContext validationContext,Object container)\ r \ n
  在   System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象   model,Type type,ModelMetadataProvider metadataProvider,   HttpActionContext actionContext,String keyPrefix)\ r \ n at   。System.Web.Http.ModelBinding.FormatterParameterBinding&LT;&GT; c__DisplayClass1.b__0(对象   模特)\ r \ n at   System.Threading.Tasks.TaskHelpersExtensions&LT;&GT; c__DisplayClass36 1.<>c__DisplayClass38.<Then>b__35()\r\n at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass49.<ToAsyncVoidTask>b__48()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func 1   func,CancellationToken cancellationToken)“}

我认为问题来自于我的 INTEGER 属性 TerminalId 被定义为 [必需] 。我觉得设置非NULLABLE属性和 [必需] 可能存在问题。

非常乐于接受建议。

----------------- ANSWER ---------------

我终于偶然发现了这个为我解决问题的线程。 DataAnnotation for Required property

只需将其粘贴到Global.asax文件中:

GlobalConfiguration.Configuration.Services.RemoveAll(
    typeof(System.Web.Http.Validation.ModelValidatorProvider),
    v => v is InvalidModelValidatorProvider);

如果您认为有更好的方法,我仍然愿意接受其他解决方案。

2 个答案:

答案 0 :(得分:0)

在Fiddler你必须使用如下

您的请求机构应该喜欢 {“TerminalId”:123,“Tag”:“222”,“TagDate”:“2014-04-13 04:22:12”} 在您的请求标头中,您需要传递内容类型,如 Content-Type:application / json;字符集= UTF-8

答案 1 :(得分:0)

就我而言,我有一个带有MVC和Web API的混合ASP.NET Web窗体。

就这样解决了:

public HttpResponseMessage PostTerminal(JObject jsonMessage) 
{
        var terminal = jsonMessage.ToObject<Terminal>();
        if (terminal == null)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest, terminal);
        }

        ...
    }

参考文献:http://weblog.west-wind.com/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods