【问题标题】:Remove ModelState errors in ASP.NET MVC删除 ASP.NET MVC 中的 ModelState 错误
【发布时间】:2016-04-01 16:16:47
【问题描述】:

有什么方法可以在 ASP.Net MVC6 中删除模型中某些属性的模型验证。

我看到了这个帖子Is there a strongly-named way to remove ModelState errors in ASP.NET MVC

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

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

谁能建议一个使用 ClearValidationStateForModel 删除模型属性的工作示例?

【问题讨论】:

标签: asp.net asp.net-mvc


【解决方案1】:

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

[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);
}

【讨论】:

  • 这两个似乎在 ASP.Net MVC 6 中都不起作用。下面是我的使用方法: [HttpPost] public ActionResult Create(CreatePost model) { //我想跳过验证标题,所以我在检查 ModelState.IsValid ModelBindingHelper.ClearValidationStateForModel(model.GetType(), ModelState,MetadataProvider,"Title"); if (ModelState.IsValid) { //to do : Save and return something } return View(model); }
  • 你是什么意思它在 MVC6 上不起作用?我刚刚在 MVC 6 项目中验证了这一点,它工作正常(dnx 451 和 dnxcore50)。具体是什么不适合你?
  • 我在模型中有不同的属性,其中一个是类型,其他是持续时间,如果所选类型为 1,我想跳过持续时间验证,而我想对所有其他类型运行验证。在 MVC5 ModelState.Remove("Duration");在检查 ModelState.IsValid 是否正常工作之前,这似乎在 MVC 6 中不起作用。我还尝试了您建议的解决方案,即 ModelState.ClearValidationState("Duration");在检查 ModelState.IsValid 之前,但它确实有效,ModelState.IsValid 返回失败。我已验证模型的所有其他属性都有有效数据。
  • 它应该工作!我刚刚验证过了。请参阅我的更新答案。我发布的代码在 MVC 6 中对我来说很好。项目。放置一个断点,看看它是否在你的 if 条件内。
  • @Shyju 我仍然使用 MVC 5,我正在尝试为 MVC 5 找到类似的库。我在哪里可以找到 MVC 5 的开源?链接 github.com/aspnet/Mvc/blob/... 仅适用于 MVC.Core。
【解决方案2】:

ModelBindingHelper 是 ASP.NET Core 2.0 / MVC6+ 的新成员

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

这是我的解决方案 - ModelState 上的 RemoveFor() 扩展方法,仿照 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
}

【讨论】:

  • 我这样做了,我验证了this.ModelState.Values.All( ms =&gt; ms.Errors.Count == 0 ) 但是this.ModelState.IsValid == false。为什么?
  • @Dai 你需要在ClearValidationState() 之后调用MarkFieldValid()。否则 ValidationState 为 Unvalidated 导致 ModelState.IsValid = false
【解决方案3】:

我需要验证以对 VM 中的单个字段产生异常

在控制器中,我在做:

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

如果“KeyName”是 ModelState 中唯一的错误,那么它现在是真的

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

【讨论】:

    【解决方案4】:

    新人使用

    ModelState.ClearValidationState("propertyname");
    ModelState.MarkFieldValid("propertyname");
    

    如果是嵌套对象,则使用 objectname.propertyname。

    这适用于 ASP.Net Core 6.0

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-11-24
      • 2011-02-27
      • 2011-02-20
      相关资源
      最近更新 更多