2012-09-17 93 views
0

添加所需的」屬性數據模型,我有這樣的數據傳輸模式:.NET MVC 4.5 - 在運行時

[DataContract] 
[Serializable] 
class PersonDTO { 

    [DataMember(Name="id")] 
    public int id { get; set; } 


    [DataMember(Name="name")] 
    [Required] 
    public string name { get; set; } 


} 

我希望能夠使用本模型用於創建和更新操作的問題在這裏當創建一個新的Person時,它的id還不存在(因此缺少[Required]註釋)。但是在更新時,id已經存在,並且必須是必填字段。

在我的控制器中,我有這些操作:

public class PersonController { 

    [HttpPut] 
    public void UpdatePerson(PersonDTO person) {} 

    [HttpPost] 
    public void CreatePerson(PersonDTO person) {} 

} 

有沒有辦法在兩種操作中使用相同的DTO,但是爲其中一個操作需要使用字段'id',所以ModelState會失敗?我知道我可以通過檢查person.id == null來手動完成,但我正在尋找一種自動解決方案(如果存在)。

回答

1

我不知道你是否仍然需要幫助,但我偶然發現你的問題,因爲我正在尋找一個類似的答案。我剛剛制定了一個簡單的方法來實現你要找的東西。它有點作弊,但它有效。

在頁面標記中,只需將「data_val_required」添加到問題字段的樣式中,然後添加所需的錯誤消息。

例如:

@Html.PasswordFor(model => model.OldPassword, 
          new { data_val_required="The Old Password field is required." }) 

客戶端驗證選擇這個向上並顯示在驗證摘要相應的消息。

在服務器端,您必須記得在代碼中驗證模型並手動檢查字段的內容,因爲您不能依賴客戶端驗證工作(例如,JavaScript可能已被禁用)。

我想這樣做的原因是在更改密碼頁面。我的模型包含三個字段:

  1. 舊密碼
  2. 新密碼[必填]
  3. 確認密碼[必填]

如果用戶做出自己的決定,舊密碼時,才需要更改密碼。如果我強迫用戶重置他/她的密碼(因爲他們丟失了舊密碼),那麼不應該要求舊密碼(因爲他們不知道它!)

所以我有一些代碼客戶端發出「data_val_required」如果用戶正在自己的意願更改密碼,並且如果不是,則刪除整個字段。

我也有服務器端的代碼來檢查這兩種情況。

希望這可以幫助你。