【问题标题】:Asp.net MVC 3 Validation exclude some field validation in TryUpdateModelAsp.net MVC 3 Validation 排除 TryUpdateModel 中的一些字段验证
【发布时间】:2012-03-07 15:14:29
【问题描述】:

我正在使用 ASP.NET MVC Razor 和数据注释验证器 我的模型:

public class Person 
{ 
    public int id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

FirstName 和 LastName 是必需的。 我想编辑名字。我的方法是:

public ActionResult Edit([Bind(Include = "FirstName")]Person person)
{
    var p = GetPerson();
    if (TryUpdateModel(p))
    {
        //Save Changes;
    }
}

但是 TryUpdateModel 总是返回 false。因为姓氏无效。

如何防止在 TryUpdateModel 中对 LastName 进行检查验证?

注意:

  • 代码已简化。我的真实代码非常复杂
  • 我必须对两个属性使用要求
  • 我不想使用不同的模型类

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    我找到了不错的解决方案。我必须从 ModelState 中删除未使用的字段。然后 ModelState.IsValid 返回 true。首先我需要创建新的属性类:

    public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var modelState = filterContext.Controller.ViewData.ModelState;
            var valueProvider = filterContext.Controller.ValueProvider;
    
            var keysWithNoIncomingValue = modelState.Keys.Where( x=>!valueProvider.ContainsPrefix(x) );
            foreach (var key in keysWithNoIncomingValue)
                modelState[key].Errors.Clear();
        }
    }
    

    然后我在我的方法上添加属性:

    [ValidateOnlyIncomingValuesAttribute]
    public ActionResult Edit([Bind(Include = "FirstName")]Person person)
    {
        var p = GetPerson();
        if (ModelState.IsValid)
        {
            TryUpdateModel(p);
            //Save Changes;
        }
    }
    

    看这个:http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

    【讨论】:

      【解决方案2】:

      您可以在检查模型是否有效之前删除不需要的属性

      ModelState.Remove("Email");
      if (ModelState.IsValid)
      {
         // whatever you want to do
      }
      

      【讨论】:

      • 这很好,只是它不能清除IsValid。至少在 .NET Core 中没有。
      • 在 ASP.NET Core 6.0 中已修复。删除存在验证错误的字段后,它将 ModelState.IsValid 值刷新为 true。
      【解决方案3】:

      我想出了一个非常简单的解决方案。

      public ActionResult Edit(Person person)
      {
          ModelState.Remove("FirstName"); // This will remove the key 
          var p = GetPerson();
          if (TryUpdateModel(p))
             {
                 //Save Changes;
             }
          }
      }
      

      【讨论】:

        【解决方案4】:

        简短回答:你不能,不使用默认的数据注释。

        更长的答案:您有多种选择。

        1. 您可以创建自己的验证器注释。
        2. 您可以让模型类继承自 IValidatableObject,然后实现 Validate 方法。 (但是,这不会进行客户端验证)。
        3. 您可以使用第三方验证库,例如 FluentValidation。
        4. 您可以为此场景创建不同的模型。
        5. 您可以删除验证,只需将代码添加到您的操作方法以检查字段是否正确。 (不建议这样做,因为这会增加控制器操作的复杂性,并且您必须在使用此模型的任何地方复制此功能)。

        【讨论】:

        • 您是否确保 FluentValidation 解决问题?我可以在 EF 中使用 FluentValidation 吗?
        • @MortezaTavakoli - 我不明白你的意思。您的问题是关于 MVC 而不是 EF。您的 EF 模型应该与您的视图模型不同。
        • EF 与此无关。不管是EF模型还是其他模型。
        猜你喜欢
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多