Validation asp.net Web API的模型绑定和验证属性存在问题
我正在用ASP.NET Web API编写一个Web API,并使用以下视图模型。 当一个特定属性上有两个验证属性(即[Required]和[StringLength(10)])时,我似乎在数据绑定方面遇到了问题 将JSON值从客户端发布到表单的控制器操作时: //发布api/列表 公共作废帖子([FromBody]TaskViewModel taskVM) 我认为:Validation asp.net Web API的模型绑定和验证属性存在问题,validation,asp.net-web-api,model-binding,Validation,Asp.net Web Api,Model Binding,我正在用ASP.NET Web API编写一个Web API,并使用以下视图模型。 当一个特定属性上有两个验证属性(即[Required]和[StringLength(10)])时,我似乎在数据绑定方面遇到了问题 将JSON值从客户端发布到表单的控制器操作时: //发布api/列表 公共作废帖子([FromBody]TaskViewModel taskVM) 我认为: 如果我删除了多个属性中的一个,那么一切都绑定正常 如果我保留多个属性,客户端将收到500个内部服务器错误,并且Post方法的主
- 如果我删除了多个属性中的一个,那么一切都绑定正常李>
- 如果我保留多个属性,客户端将收到500个内部服务器错误,并且Post方法的主体将永远无法访问李>
您需要检查500内部服务器中的内容
- 确保在web.config中关闭
- 如果您自托管web.API,则需要设置
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always代码>
- 使用浏览器开发控制台的网络选项卡(在IE浏览器中,您可以使用F12获得控制台),或者如果您使用FireFox,则使用FireBug或类似的第三方工具
[必需]
标记了属性。要解决这个问题,异常会告诉您该怎么做
您需要将[DataMember(IsRequired=true)]
添加到属性类型为值类型(例如int、datatime等)的所需属性中:
因此,将您的TaskViewModel
更改为:
[DataContract]
公共类任务视图模型
{
//默认构造函数
公共任务视图模型(){}
[数据成员]
公共Guid TaskId{get;set;}
[必需]
[数据成员]
[条次建议修正案(10)]
公共字符串说明{get;set;}
[必需]
[数据成员(IsRequired=true)]
[数据类型(数据类型.日期时间)]
public System.DateTime开始日期{get;set;}
[必需]
[数据成员]
公共字符串状态{get;set;}
[数据成员]
public System.Guid ListID{get;set;}
}
一些旁注:
- 您需要引用System.Runtime.Serialization dll才能使用
DataMemberAttribute
- 您需要使用
标记类,并且需要使用[DataContract]
标记其所有属性,而不仅仅是所需的属性[DataMember]
- 确保在web.config中关闭
- 如果您自托管web.API,则需要设置
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always代码>
- 使用浏览器开发控制台的网络选项卡(在IE浏览器中,您可以使用F12获得控制台),或者如果您使用FireFox,则使用FireBug或类似的第三方工具
[必需]
标记了属性。要解决这个问题,异常会告诉您该怎么做
您需要将[DataMember(IsRequired=true)]
添加到属性类型为值类型(例如int、datatime等)的所需属性中:
因此,将您的TaskViewModel
更改为:
[DataContract]
公共类任务视图模型
{
//默认构造函数
公共任务视图模型(){}
[数据成员]
公共Guid TaskId{get;set;}
[必需]
[数据成员]
[条次建议修正案(10)]
公共字符串说明{get;set;}
[必需]
[数据成员(IsRequired=true)]
[数据类型(数据类型.日期时间)]
public System.DateTime开始日期{get;set;}
[必需]
[数据成员]
公共字符串状态{get;set;}
[数据成员]
public System.Guid ListID{get;set;}
}
一些旁注:
- 您需要引用System.Runtime.Serialization dll才能使用
DataMemberAttribute
- 您需要使用
标记类,并且需要使用[DataContract]
标记其所有属性,而不仅仅是所需的属性[DataMember]
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; }
}