2010-11-04 63 views
1

我有一個表格,現在可以發佈13個對象。一些對象可以是可選的,比如推薦者,其他人不可以。問題是,如果我使用DAV並裝飾具有驗證屬性的對象(如[Required]),即使該對象是可選的,整個帖子也將失敗,因爲ModelState將無效。是否有可能通過數據註釋進行「選擇性」驗證?

我可以從所有對象中刪除[Required]裝飾,但那不正確。那麼,有沒有辦法在仍然使用DAV的情況下選擇性地驗證單個對象?

考慮一下:

<form> 
    <input type="hidden" name="Description.AuthorId" value="{?}" /> 
    <p> 
     <label>Office</label> 
     <select name="Job.OfficeId">{?}</select> 
    </p> 
    <p> 
     <label>Description</label> 
     <textarea name="Description.Text"></textarea> 
    </p> 
</form> 

在我與JobDescription工作這個大大簡化形式(Description真是Note型就DB而言)。必須填寫信息Job,但描述是可選的。該表單的問題是,Description.AuthorId總是使用當前授權用戶的ID填充。

public class Note { 
    [Required] 
    public short AuthorId { get; set; } 

    [Required, StringLength(XXX)] 
    public string Text { get; set; } 
} 

public RedirectToRouteResult Jobs(
    [Bind(Prefix = "Job", Include = "OfficeId")] Job Job, 
    [Bind(Prefix = "Description", Include = "AuthorId,Text")] Note Description) { 
    if (ModelState.IsValid) { 
     if (Description != null) { 
      Description.Job = Job; 
     }; 

     DataContext.Jobs.InsertOnSubmit(Job); 
     DataContext.SubmitChanges(); 
    }; 
} 

與方法的第一個問題是,由於形式Description總是會發生,因爲形式將永遠傳遞Description.AuthorId所以條件檢查,如果Description爲空,如果Description.Text從來沒有填充永遠不會甚至稱in。

第二個問題是因爲DAV,如果Description.Text沒有填充,那麼整個模型將無法通過驗證,因爲它是Note的必填字段。因此,我甚至沒有機會做其他事情。

所以,我想我的問題是,什麼是適當的方式來實現驗證(DAV?)的對象可以在UI形式是可選的,但由於數據庫設計本身具有必需的字段?我在想

一種方式是不是傳遞對象的方法是實例化它們的方法,然後才能在每一個執行TryUpdateModel,檢查模型狀態,並繼續在基於條件。這可能需要很多代碼,所以我想在跳入該解決方案之前查看是否有更自動的版本。

幫助將不勝感激!

+0

你能澄清一下你真正想在這裏發生嗎?我從你的文章中瞭解到,必須填寫Job對象(如果您發佈了Job類的代碼,這將很有用),但Description.Text字段是可選的。如果Description.Text是可選的,那麼爲什麼你用一個Required數據註解來裝飾它? – 2011-04-05 09:17:35

+0

一個'Description'是數據庫中的'Note',與'Job'的關係爲1:1。由於'Note'必須有文本才能成爲音符,所以文本屬性是必需的。最後,我問了這個MVC 3之前的版本,現在已經不存在了,我可以利用其中的新DAV來做我所需要的。 – Gup3rSuR4c 2011-04-05 21:47:03

回答

0

我的建議是創建視圖模型(用於視圖數據/驗證和模型綁定的簡單模型,稍後將映射到db模型)。試圖用所有驗證推動你的business/db模型並不總是可能的。如果某個模型在某些地方的驗證方式不同,那麼很可能是因爲它們都是綠色的,因此您會在方形洞中強制使用圓釘。如果由於某些限制必須使用相同的對象,則可以選擇忽略驗證或從控制器上的ModelState字典中刪除有問題的錯誤,但這不是一個好主意。

相關問題