我有一個表格,現在可以發佈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>
在我與Job
和Description
工作這個大大簡化形式(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
,檢查模型狀態,並繼續在基於條件。這可能需要很多代碼,所以我想在跳入該解決方案之前查看是否有更自動的版本。
幫助將不勝感激!
你能澄清一下你真正想在這裏發生嗎?我從你的文章中瞭解到,必須填寫Job對象(如果您發佈了Job類的代碼,這將很有用),但Description.Text字段是可選的。如果Description.Text是可選的,那麼爲什麼你用一個Required數據註解來裝飾它? – 2011-04-05 09:17:35
一個'Description'是數據庫中的'Note',與'Job'的關係爲1:1。由於'Note'必須有文本才能成爲音符,所以文本屬性是必需的。最後,我問了這個MVC 3之前的版本,現在已經不存在了,我可以利用其中的新DAV來做我所需要的。 – Gup3rSuR4c 2011-04-05 21:47:03