Asp.net-Mvc
使用 ModelState.Remove 處理 ModelState 是否正確?
我正在開發一個大型 MVC3 Web 應用程序,並且對該
ModelState.IsValid方法感到煩惱。我幾乎所有的控制器都使用了 ModelState 來驗證發布的數據。這些視圖都基於包含不同類的 ViewModel,這些類顯然包含可以標記為的屬性
[Required]。我遇到的問題是有時不需要所需的屬性,我必須使用該
ModelState.Remove方法才能ModelState.IsValid實現。我的問題是通過使用
ModelState.Remove,這是正確的做事方式還是有更有效的方法。
如果您
[Required]在兩種不同的上下文中使用具有屬性的同一視圖模型,一種是需要該屬性,另一種是不需要該屬性,那麼您需要ModelState在執行過程中手動更改。另一種方法是使用不同的視圖模型。可能有一個基類,其中包含所有屬性,但有問題的必需屬性除外。然後從中派生兩個視圖模型,一個具有需要的屬性,一個具有不需要的屬性(我知道這是重複的)。您可能決定將它們完全分開而不使用繼承。
這是我的解決方案 -
RemoveFor()上的擴展方法ModelState,仿照 MVC HTML 助手:public static void RemoveFor<TModel>(this ModelStateDictionary modelState, Expression<Func<TModel, object>> expression) { string expressionText = ExpressionHelper.GetExpressionText(expression); foreach (var ms in modelState.ToArray()) { if (ms.Key.StartsWith(expressionText + ".") || ms.Key == expressionText) { modelState.Remove(ms); } } }這是它的使用方法:
if (model.CheckoutModel.ShipToBillingAddress == true) { // REUSE BILLING ADDRESS FOR SHIPPING ADDRESS ShoppingCart.ShippingAddress = ShoppingCart.BillingAddress; // REMOVE MODELSTATE ERRORS FOR SHIPPING ADDRESS ModelState.RemoveFor<SinglePageStoreModel>(x => model.CheckoutModel.ShippingAddress); }因此,在回答您的問題時,我相信肯定有這樣的案例是正確的方法,並且像這樣的強類型助手使它看起來更好看 - 如果您擔心很多,也更容易證明的魔法弦。