2013-01-24 83 views
1

我寫用的ASP.NET Web API上的Web API,並利用以下視圖模型的屬性。 我似乎具有與所述數據綁定的問題時,有在一個特定的屬性兩個驗證屬性(即[必需]和[StringLength(10)])。使用模型綁定和驗證問題與asp.net的Web API

投遞來自客戶端的JSON值到以下形式的控制器動作:

// POST 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

您需要檢查的是在500內部服務器內部

  • 確保您打開customerror關閉在你的web.config
  • 如果selfhost web.API你需要設置GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  • 使用您的瀏覽器開發控制檯的網絡選項卡(在IE中,Chrome可以使用F12獲得控制檯),或者如果您使用FireFox,則使用FireBug或第三方工具,如Fiddler

然後你可以看到服務器上出了什麼問題,並進一步解決你的問題。

你的情況,這是在響應:

「消息」:「發生錯誤」,「ExceptionMessage」:「物業 ‘起始日期’的類型‘MvcApplication3.Controllers.TaskViewModel’是 無效。值類型屬性標記爲[必要]也必須是標有[數據成員(IsRequired =真)] 被識別爲需要 。考慮使用[DataContract] 和與屬性歸因聲明類型 [數據成員(IsRequired =真)] 「」 ExceptionType。 「:」 System.I nvalidOperationException」

所以你的問題不在於你有兩個屬性,但已與[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]來標記其所有屬性,而不僅僅是所需的。
+0

很好,這是固定的問題。非常感激。 – JBradshaw