2017-04-12 24 views
-1

MVC應用5 ....模型驗證 - 造成的ModelState是無效

我有許多領域的典範......他們的2 ...

(這是模型。)
public string eventStatus {get; set;} 
public DateTime? eventDateStarted {get; set;} 
public DateTime? eventDateCompleted {get; set;} 

我想要做的就是絕不允許eventStatus設置爲「Closed」,除非eventDateStarted和eventDateCompleted字段不爲空。如果是這樣,則會導致無效的ModelState。

請注意:這裏涉及的編程邏輯可能會根據業務規則變得更高級。所以,這不僅僅是一個簡單的說這個字段是必需的,以便這個被設置,等等...

我在想這個邏輯的最佳放置方法是eventStatus的設置方法。這是最佳實踐解決方案嗎?如果是這樣,我該如何強制ModelState無效?

這是我到目前爲止已經寫...

[Display(Name = "Status")] 
    public string eventStatus 
    { 
     set 
     { 
      if (EventActualEnd is null || EventActualStart is null) 
      { 
       ModelState.AddModelError("Status", "Start and End date is mandatory"); 
      } 
     } 
    } 

但是,它不喜歡AddModelError。

+0

[屬性依賴於另一個字段]可能的重複(http://stackoverflow.com/questions/3713281/attribute-dependent-on-another-field) –

+0

創建條件驗證屬性。有關良好的指南,請參閱[ASP.NET MVC 3中的驗證完整指南 - 第2部分](http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp .net-mvc-3-part-2) –

回答

1

我不確定您的AuditStatusId代碼在哪裏,但它看起來在我的模型中。 ModelState是控制器的屬性,只能從繼承自System.Web.Mvc.Controller的類訪問。

外部庫是您的可行選擇嗎?如果是的話,我會檢查出通過NuGet提供的MVC Foolproof。它允許內置的複雜模型數據註釋完成您想要的內容。您可以根據許多不同情況設置自定義驗證並創建自己的驗證。

如果這不是可能性,默認情況下,MVC在模型中的內置數據註釋中有所限制,用於驗證。你必須用自己的擴展,或者在控制器邏輯中,通常在服務器端檢查ModelState.IsValid,在自己的邏輯中添加檢查當前模型變量以及繼續或者跳出邏輯路徑的邏輯手動執行ModelState.IsValid。有了這樣的複雜檢查,它應該是非常少的代碼,如果你需要做多個地方,你可以把它分解成一個工具類並傳入模型,在那裏進行驗證,然後返回對於驗證是真的還是假的。再次,這只是服務器端,如果你想根據應用程序的構建方式進行客戶端驗證,你需要在客戶端做類似的魔術。

+0

謝謝。是的,那是模型中的代碼(set方法)。我在上面編輯它。這是我自己的應用程序,所以我可以使用萬無一失的高級註釋。感謝您的建議。 – WebDevGuy2