首页 文章

POST控制器值始终为NULL

提问于
浏览
2

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

我一直在构建我的第一个asp.net 4.5 MVC4 Web Api,但是在controll POST方法中收到的值总是为NULL .

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

这是我的代码:

Controller (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);
        }
    }

Model Class

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

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

Method: POST

Address:

http://localhost:52036/api/terminal

Header:

Content-Type: application/json
Host: localhost:52036
Content-Length: 60

Body:

{"TerminalId":123,"Tag":"222","TagDate":2014-04-13 04:22:12}

----------- EDIT - 13-04-2014 14:56 -------------

我已按照以下详细信息修改了我对此问题的一些回复中建议的Fiddler http post请求 . 但是,当我在VS2013调试模式下进行测试时,我一直收到500 HTTP错误,我的API代码甚至没有到达Controller .

Address

POST
http://localhost:52036/api/terminal/

Header

Content-Type: application/json; charset=utf-8
Host: localhost:52036
Content-Length: 62

Body

{"TerminalId":123,"Tag":"222","TagDate":"2014-04-13 04:22:12"}

-------------- Edit 13/04/2014 20:38 -----------------

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

{“消息”:“发生错误 . ”,“ExceptionMessage”:“类型'ClockingDemo.Models.Terminal'上的属性'TerminalId'无效 . 标记为[必需]的值类型属性也必须标记为[ DataMember(IsRequired = true)]被认为是必需的 . 考虑使用[DataContract]归属声明类型和[DataMember(IsRequired = true)]的属性 . “,”ExceptionType“:”System.InvalidOperationException“,”StackTrace“ :“System.Web.Http.Validation.Validators.ErrorModelValidator.Validate(ModelMetadata metadata,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ShallowValidate(ModelMetadata metadata,ValidationContext validationContext,Object container) r \ n at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata,ValidationContext validatio) nContext)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata,ValidationContext validationContext,Object container)\ r \ n在System.Web.Http.Validation.DefaultBodyModelValidator.Validate(对象模型,类型类型) ,System.Threading.Tasks.TaskHelpersExtensions中的System.Web.Http.ModelBinding.FormatterParameterBinding . <> c__DisplayClass1.b__0(对象模型)\ r \ n中的ModelMetadataProvider metadataProvider,HttpActionContext actionContext,String keyPrefix)\ r \ n . <> c__DisplayClass361 . <> c__DisplayClass38 . <Then> b__35()\ r \ n在System.Threading.Tasks.TaskHelpersExtensions . <> c__DisplayClass49 . <ToAsyncVoidTask> b__48()\ r \ n在System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult] ](Func1 func,CancellationToken cancellationToken)“}

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

非常乐于接受建议 .

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

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

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

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

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

2 回答

  • 0

    在Fiddler你必须使用如下

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

  • 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

相关问题