【问题标题】:POST controller value is always NULLPOST 控制器值始终为 NULL
【发布时间】:2014-10-28 07:51:10
【问题描述】:

首先感谢您抽出宝贵时间阅读这篇文章。

我一直在构建我的第一个 asp.net 4.5 MVC4 Web Api,但在控制 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 发布的命令:

方法: 发布

地址:

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 发布请求,并提供了以下详细信息。但是,在 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 客户端,我注意到以下返回错误消息:

{"Message":"发生错误。","ExceptionMessage":"属性 “ClockingDemo.Models.Terminal”类型上的“TerminalId”无效。 标记为 [Required] 的值类型属性也必须标记为 [DataMember(IsRequired=true)] 按要求被识别。考虑 使用 [DataContract] 和属性赋予声明类型 和 [DataMember(IsRequired=true)].","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(模型元数据 元数据,对象容器)\r\n at System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata 元数据、ValidationContext 验证上下文、对象容器)\r\n
在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据、ValidationContext 验证上下文、对象容器)\r\n
在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(模型元数据 元数据,ValidationContext 验证上下文)\r\n 在 System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata 元数据、ValidationContext 验证上下文、对象容器)\r\n
在 System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象 模型,类型类型,ModelMetadataProvider 元数据提供者, HttpActionContext actionContext,字符串 keyPrefix)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.c__DisplayClass1.b__0(Object 型号)\r\n 在 System.Threading.Tasks.TaskHelpersExtensions.c__DisplayClass361.<>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](Func1 func, CancellationToken cancelToken)"}

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

非常愿意接受建议。

----------------- 答案 ---------------

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

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

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

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

【问题讨论】:

标签: asp.net-mvc-4 asp.net-web-api asp.net-4.5 asp.net-web-api2


【解决方案1】:

在 Fiddler 中你必须像下面这样使用

您的请求正文应该像这样 {"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"} 在您的请求标头中,您需要传递这样的内容类型 Content-Type: application/json; charset=utf-8

【讨论】:

  • 不幸的是,这仍然不起作用@Naveen。我不断收到 500 错误。在调试模式下运行我的 API 时,代码甚至没有到达控制器以在我的断点处停止。请参阅我的原始问题,我已经发布了您建议的修改的编辑。
【解决方案2】:

就我而言,我有一个带有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多