2012-04-07 67 views

回答

8

不能使用DataAnnotations,因爲這些都是在編譯時實現的,不能動態地添加完成。您可以

創建具有合適的註釋

有您的視圖模型發送給服務並根據檢查行動的模型是不同的視圖模型,它是由與收益未來你可以附加到你的模型狀態驗證錯誤的列表

把一個屬性上的視圖模型,如string IsBeingUsedFor和使用,在結合有RequiredIf大taAnnotation。 Here is an example of a library already build that uses conditional DataAnnotations。然後,你可以說,[RequireIf(「IsBeingUsedFor」,「Action_A」)

這些不一定所有的選項,但一些清潔劑的人的。你可以用JavaScript來完成這一切,但如果一個'壞人'提交表單並繞過客戶端驗證,你將失去服務器端驗證,並可能在應用程序中打開一些漏洞。

+0

優秀信息!從再看看我需要的東西,我想我可以製作一個從我的基本視圖模型繼承的視圖模型,並避開它。如果沒有,我會嘗試RequiredIf。 – 2012-04-08 01:02:13

3

我不知道有什麼辦法來做到這一點與數據註釋。但是,在您的視圖中,您可以在javascript中添加/刪除所需的規則。

$("#myProperty").rules("add", { required: true }); 

$("#myProperty").rules("remove", "required"); 
+0

這是很好的瞭解,謝謝!我可能會使用RequiredIf,但會牢記這一點。 – 2012-04-08 01:01:22

2

Attributes在運行時通過反射進行訪問,所以我不知道你可以在需要時關閉和打開。我的建議是創建一個「必需的」ViewModel和一個「NotRequired」視圖模型。我知道這可能是你想要的,但這是我能想到的最簡單的方法。

0

如果客戶端驗證足夠你,那麼你可以做你的Razor視圖下,例如:

@Html.LabelFor(model => model.title, new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @if (Model.IsTitleRequired == true) 
     { 
      @Html.TextBoxFor(model => model.title, new { @required = true }) 
     } 
     else 
     { 
      @Html.TextBoxFor(model => model.title) 
     } 
     @Html.ValidationMessageFor(model => model.title) 
    </div>