我正在使用ASP.NET Web API编写Web API,并使用以下View Model。 当特定属性上有两个验证属性时,我似乎遇到了数据绑定问题(即[Required]和[StringLength(10)])。
将JSON值从客户端发布到表单的控制器操作时:
// POST api / list
public void Post([FromBody] TaskViewModel taskVM)
我观察到以下内容:
为什么会这样? 干杯
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; }
}
答案 0 :(得分:4)
您需要检查500内部服务器内部的内容
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
然后你可以看到服务器上出了什么问题并进一步解决你的问题。
在你的情况下,这是在回复中:
“消息”:“发生了错误。”,“ExceptionMessage”:“属性 'MvcApplication3.Controllers.TaskViewModel'类型的'StartDate'是 无效。 标记为[必需]的值类型属性也必须为 标记为[DataMember(IsRequired = true)]被识别为 需要即可。考虑使用[DataContract]归因声明类型 和财产 [数据成员(IsRequired =真)] “” ExceptionType。 “:” System.InvalidOperationException“
所以你的问题不在于你有两个属性,而是用[Required]
标记你的属性来解决这个问题,异常会告诉你该怎么做。
您需要将[DataMember(IsRequired=true)]
添加到属性类型为值类型的必需属性(例如int,datatime等):
因此,请将TaskViewModel
更改为:
[DataContract]
public class TaskViewModel
{
//Default Constructor
public TaskViewModel() { }
[DataMember]
public Guid TaskId { get; set; }
[Required]
[DataMember]
[StringLength(10)]
public string Description { get; set; }
[Required]
[DataMember(IsRequired = true)]
[DataType(DataType.DateTime)]
public System.DateTime StartDate { get; set; }
[Required]
[DataMember]
public string Status { get; set; }
[DataMember]
public System.Guid ListID { get; set; }
}
一些旁注:
DataMemberAttribute
[DataContract]
标记您的课程,并且您需要使用[DataMember]
标记其所有属性,而不仅仅是必需的属性。