我正在使用ASP.NET Web API编写Web API,并使用以下View Model . 当特定属性上有两个验证属性时,我似乎遇到了数据绑定问题(即[Required]和[StringLength(10)]) .
将JSON值从客户端发布到表单的控制器操作时:
// POST api / list
public void Post([FromBody] TaskViewModel taskVM)
我观察到以下情况:
-
如果我删除多个属性中的一个,一切都绑定好了;
-
如果我留下多个属性,客户端将收到500内部服务器错误,并且永远不会到达Post方法的主体 .
任何想法为什么会这样?干杯
public class TaskViewModel
{
//Default Constructor
public TaskViewModel() { }
public static TaskViewModel MakeTaskViewModel(Task task)
{
return new TaskViewModel(task);
}
//Constructor
private TaskViewModel(Task task)
{
this.TaskId = task.TaskID;
this.Description = task.Description;
this.StartDate = task.StartDate;
this.Status = task.Status;
this.ListID = task.ListID;
}
public Guid TaskId { get; set; }
[Required]
[StringLength(10)]
public string Description { get; set; }
[Required]
[DataType(DataType.DateTime)]
public System.DateTime StartDate { get; set; }
[Required]
public string Status { get; set; }
public System.Guid ListID { get; set; }
}
1 回答
您需要检查500内部服务器内部的内容
确保在web.config中关闭customerror
如果你是selfhost web.API你需要设置
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
使用浏览器开发控制台的网络选项卡(在IE中,Chrome可以使用F12获取控制台),或者如果您使用的是FireFox,则使用FireBug或者像Fiddler这样的第三方工具 .
然后你可以看到服务器上出了什么问题,并进一步解决你的问题 .
在你的情况下,这是在响应中:
所以你的问题不在于你有两个属性,而是用
[Required]
标记了你的属性来解决这个问题,异常告诉你该怎么做 .您需要将
[DataMember(IsRequired=true)]
添加到属性类型为值类型的所需属性(例如int,datatime等):所以将你的_512615改为:
一些附注:
您需要引用System.Runtime.Serialization dll才能使用
DataMemberAttribute
您需要使用
[DataContract]
标记您的类,并且您需要使用[DataMember]
标记其所有属性,而不仅仅是必需的属性 .