首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 4

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

    • 确保在web.config中关闭customerror

    • 如果你是selfhost web.API你需要设置 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

    • 使用浏览器开发控制台的网络选项卡(在IE中,Chrome可以使用F12获取控制台),或者如果您使用的是FireFox,则使用FireBug或者像Fiddler这样的第三方工具 .

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

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

    “消息”:“发生了错误 . ”,“ExceptionMessage”:“MvcApplication3.Controllers.TaskViewModel”类型的“属性'StartDate'无效 . 标记为[必需]的值类型属性也必须用[DataMember]标记(IsRequired = true)]被识别为必需 . 考虑将声明类型与[DataContract]和属性[DataMember(IsRequired = true)]归结为 . “,”ExceptionType“:”System.InvalidOperationException“

    所以你的问题不在于你有两个属性,而是用 [Required] 标记了你的属性来解决这个问题,异常告诉你该怎么做 .

    您需要将 [DataMember(IsRequired=true)] 添加到属性类型为值类型的所需属性(例如int,datatime等):

    所以将你的_512615改为:

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

相关问题