1

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

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

// 发布 api/列表

公共无效帖子([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; }       
}
4

1 回答 1

4

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

  • 确保在 web.config 中关闭customerror
  • 如果你自己托管 web.API,你需要设置GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  • 使用浏览器开发控制台的网络选项卡(在 IE、Chrome 中,您可以使用 F12 获取控制台),或者如果您使用的是 FireFox,则使用 FireBug 或Fiddler等第三方工具。

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

在您的情况下,这是在响应中:

"Message":"发生错误。","ExceptionMessage":"类型 'MvcApplication3.Controllers.TaskViewModel' 上的属性 'StartDate' 无效。标记为 [Required] 的值类型属性也必须标记为 [DataMember( IsRequired=true)] 被认为是必需的。考虑使用 [DataContract] 和属性使用 [DataMember(IsRequired=true)]。","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]而不仅仅是必需的属性。
于 2013-01-24T12:00:59.267 回答