Asp.net-Mvc

使用 ModelState.Remove 處理 ModelState 是否正確?

  • July 27, 2011

我正在開發一個大型 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);
}

因此,在回答您的問題時,我相信肯定有這樣的案例是正確的方法,並且像這樣的強類型助手使它看起來更好看 - 如果您擔心很多,也更容易證明的魔法弦。

引用自:https://stackoverflow.com/questions/6843171