删除ASP.NET MVC中的ModelState错误

时间:2016-04-01 16:16:48

标签: asp.net asp.net-mvc

有没有办法在ASP.Net MVC6中的模型中删除某些属性的模型验证。

我发现了这篇文章Is there a strongly-named way to remove ModelState errors in ASP.NET MVC

建议使用ModelBindingHelper.ClearValidationStateForModel(Type,ModelStateDictionary,IModelMetadataProvider,string)。

但我无法在此找到任何进一步的帮助。

有人可以建议使用ClearValidationStateForModel删除模型属性的工作示例吗?

3 个答案:

答案 0 :(得分:3)

这应该会删除Title视图模型的CreatePost属性的验证错误。

[HttpPost]
public ActionResult Create(CreatePost model)  
{
    if (ModelState.IsValid)
    {
      //to do : Save and return something
    }   
    ModelBindingHelper.ClearValidationStateForModel(model.GetType(),
                                              ModelState,MetadataProvider,"Title");        
    return View(model);
}

此外,ModelState.ClearValidationState也可以。

ModelState.ClearValidationState("Title");

编辑:根据评论,OP希望根据另一个属性值排除某个要验证的属性。这应该可以正常工作。

[HttpPost]
public ActionResult Create(CreatePost model)   //CreatePost model
{
    if (model.Type == 1)
    {
        ModelBindingHelper.ClearValidationStateForModel(model.GetType(), 
                                                    ModelState, MetadataProvider, "Title");
    }
    if (ModelState.IsValid)
    {
        // to do : Do useful stuff and return something
    }
    return View(model);
}

答案 1 :(得分:1)

ModelBindingHelper是ASP.NET Core 2.0 / MVC6 +

的新功能

如果您需要使用以前版本的.NET / ASP.NET,您可以根据Is there a strongly-named way to remove ModelState errors上的Simon_Weaver答案执行以下操作:

  

这是我的解决方案 - 在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 + "."))
        {
            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
}

答案 2 :(得分:0)

我需要进行验证,以使VM中的单个字段具有例外

在控制器中,我正在做

if ("true" == Condition)
{
    ModelState.Remove("KeyName");
}

如果“ KeyName”是ModelState中的唯一错误,则现在为true

if (ModelState.IsValid)
{   
    // ModelState.IsValid is true now
}