使用asp.net Web API进行模型绑定和验证属性的问题

时间:2013-01-24 10:36:33

标签: validation asp.net-web-api model-binding

我正在使用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 个答案:

答案 0 :(得分:4)

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

  • 确保您在web.config
  • 中关闭customerror
  • 如果您是selfhost web.API,则需要设置GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  • 使用您的浏览器开发控制台的网络标签(在IE浏览器中,您可以通过F12获取Chrome控制台),或者如果您使用的是FireFox,则使用FireBug或像Fiddler这样的第三方工具。

然后你可以看到服务器上出了什么问题并进一步解决你的问题。

在你的情况下,这是在回复中:

  

“消息”:“发生了错误。”,“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; }
}

一些旁注:

  • 您需要引用System.Runtime.Serialization dll才能使用DataMemberAttribute
  • 您需要使用[DataContract]标记您的课程,并且您需要使用[DataMember]标记其所有属性,而不仅仅是必需的属性。