Validation asp.net Web API的模型绑定和验证属性存在问题

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方法的主

我正在用ASP.NET Web API编写一个Web API,并使用以下视图模型。 当一个特定属性上有两个验证属性(即[Required]和[StringLength(10)])时,我似乎在数据绑定方面遇到了问题

将JSON值从客户端发布到表单的控制器操作时:

//发布api/列表

公共作废帖子([FromBody]TaskViewModel taskVM)

我认为:

  • 如果我删除了多个属性中的一个,那么一切都绑定正常
  • 如果我保留多个属性,客户端将收到500个内部服务器错误,并且Post方法的主体将永远无法访问
你知道为什么会这样吗? 干杯


您需要检查500内部服务器中的内容

  • 确保在web.config中关闭
  • 如果您自托管web.API,则需要设置
    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always
  • 使用浏览器开发控制台的网络选项卡(在IE浏览器中,您可以使用F12获得控制台),或者如果您使用FireFox,则使用FireBug或类似的第三方工具
然后您可以看到服务器上出现了什么问题,并进一步解决您的问题

在您的案例中,这是在响应中:

“消息”:“发生错误。”,“异常消息”:“属性” 类型“MVCAPApplication3.Controllers.TaskViewModel”上的“StartDate”为 无效。标记为[Required]的值类型属性也必须是 标记有[DataMember(IsRequired=true)]以识别为 需要< <强> >考虑将声明类型归因于[数据通道] 以及与 [DataMember(IsRequired=true)],“异常类型”:“System.InvalidOperationException”

因此,您的问题不是您有两个属性,而是您已经用
[必需]
标记了属性。要解决这个问题,异常会告诉您该怎么做

您需要将
[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]
    标记其所有属性,而不仅仅是所需的属性

您需要检查500内部服务器中的内容

  • 确保在web.config中关闭
  • 如果您自托管web.API,则需要设置
    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy=IncludeErrorDetailPolicy.Always
  • 使用浏览器开发控制台的网络选项卡(在IE浏览器中,您可以使用F12获得控制台),或者如果您使用FireFox,则使用FireBug或类似的第三方工具
然后您可以看到服务器上出现了什么问题,并进一步解决您的问题

在您的案例中,这是在响应中:

“消息”:“发生错误。”,“异常消息”:“属性” 类型“MVCAPApplication3.Controllers.TaskViewModel”上的“StartDate”为 无效。标记为[Required]的值类型属性也必须是 标记有[DataMember(IsRequired=true)]以识别为 需要< <强> >考虑将声明类型归因于[数据通道] 以及与 [DataMember(IsRequired=true)],“异常类型”:“System.InvalidOperationException”

因此,您的问题不是您有两个属性,而是您已经用
[必需]
标记了属性。要解决这个问题,异常会告诉您该怎么做

您需要将
[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; }       
}