【发布时间】: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);
如果您认为有更好的方法,我仍然愿意接受其他解决方案。
【问题讨论】:
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
-
注明。 (我应该感谢您指出这一点吗?)
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
标签: asp.net-mvc-4 asp.net-web-api asp.net-4.5 asp.net-web-api2