14

ASP.NET MVC ポストバック中に ModelState エラーを手動で記述することなく削除する方法はありますか。

チェックボックスがあり、チェックされたときにBilling Same As Shippingユーザーが書いたものを無視したいとしましょうShippingAddress- 通常、あなたができることはこれです。

ModelState.Remove("Checkout.ShipppingAddress.FirstName");
ModelState.Remove("Checkout.ShipppingAddress.LastName");
ModelState.Remove("Checkout.ShipppingAddress.Address1");
ModelState.Remove("Checkout.ShipppingAddress.Address2");
...
ModelState.Remove("Checkout.ShipppingAddress.ZipCode");
4

3 に答える 3

29

これが私の解決策です-MVC HTMLヘルパーをモデルにしたRemoveFor()拡張メソッドです:ModelState

    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 + "."))
            {
                modelState.Remove(ms);
            }
        }
    }

使用方法は次のとおりです。

if (model.CheckoutModel.ShipToBillingAddress == true) 
{
    // COPY BILLING ADDRESS --> SHIPPING ADDRESS
    ShoppingCart.ShippingAddress = ShoppingCart.BillingAddress;

    // REMOVE MODELSTATE ERRORS FOR SHIPPING ADDRESS
    ModelState.RemoveFor<SinglePageStoreModel>(x => x.CheckoutModel.ShippingAddress);
}

if (ModelState.IsValid) 
{
     // should get here now provided billing address is valid
}

誰かがそれを改善する方法を見ることができる場合 (またはジェネリック型引数を指定する必要がない場合) は、私に知らせてください。または、これが別の名前で MvcFutures に存在する場合は、それに切り替えたいと思います。

私がやっている間、ModelStateが特定の「ツリー」に対して有効かどうかを確認するヘルパーがあります

    public static bool IsValidFor<TModel, TProperty>(this TModel model,
                                                     System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression,
                                                     ModelStateDictionary modelState)
    {
        string name = ExpressionHelper.GetExpressionText(expression);

        return modelState.IsValidField(name);
    }

次のように使用できます。

 if (model.IsValidFor(x => x.CheckoutModel.BillingAddress, ModelState))
 {
     _debugLogger.Log("Billing Address Valid", () => ShoppingCart.BillingAddress);
 }
于 2012-12-23T04:26:09.623 に答える
4

これがMVC 6用である場合は、 を使用することをお勧めしModelBindingHelper.ClearValidationStateForModel(Type, ModelStateDictionary, IModelMetadataProvider, string)ます。

于 2015-09-19T21:47:48.597 に答える