ASP MVC5-Custom要求验证在db.savechanges

时间:2016-03-19 21:16:52

标签: c# asp.net asp.net-mvc-5 requiredfieldvalidator customvalidator

首先,感谢所有回答问题的人。我是asp框架的新学习者,并从这些答案中学到了很多东西。

我是一个有2列的模型

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

[Display(Name = "Service")]
[MaxLength(50)]
[RequiredIf("person1 ", "Yes", ErrorMessage = "Service Field is Required")]
public string Service  { get;set; }

然后我使用了本网站的RequiredIf。

   public class RequiredIfAttribute : ValidationAttribute
    {
        private RequiredAttribute innerAttribute = new RequiredAttribute();
        public string DependentUpon { get; set; }
        public object Value { get; set; }

        public RequiredIfAttribute(string dependentUpon, object value)
        {
            this.DependentUpon = dependentUpon;
            this.Value = value;
        }

        public RequiredIfAttribute(string dependentUpon)
        {
            this.DependentUpon = dependentUpon;
            this.Value = null;
        }

        public override bool IsValid(object value)
        {
            return innerAttribute.IsValid(value);
        }
    }

    public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
    {
        public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute)
            : base(metadata, context, attribute)
        { }
        public override IEnumerable<ModelValidationResult> Validate(object container)
        { 
            var field = Metadata.ContainerType.GetProperty(Attribute.DependentUpon);
            if (field != null)
            {
                var value = field.GetValue(container, null);
                if ((value != null && Attribute.Value == null) || (value != null && value.Equals(Attribute.Value)))
                {
                    if (!Attribute.IsValid(Metadata.Model))
                        yield return new ModelValidationResult { Message = ErrorMessage };
                }
            }
        }
    }

Controller每次点击屏幕上的保存按钮时都会执行以下操作方法: -

public ActionResult Create( Person person1)
        {
            if (ModelState.IsValid)
            {

                db.Person.Add(person1);
                try
            {
                db.SaveChanges();
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
            {
                Exception raise = dbEx;
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        string message = string.Format("{0}:{1}",
                            validationErrors.Entry.Entity.ToString(),
                            validationError.ErrorMessage);
                        // raise a new exception nesting  
                        // the current instance as InnerException  
                        raise = new InvalidOperationException(message, raise);
                    }
                }
                throw raise;
            }  
            return RedirectToAction("Index");
        }

        return View(person);
    }

以下是创建视图

<div class="form-group">
                    @Html.LabelFor(model => model.person1 , htmlAttributes: new { @class = "control-label col-md-4" })
                    <div class="col-md-4">
                        @Html.RadioButtonFor(model => model.person1 , "Yes", new { id = "person1Yes" })
                        @Html.Label("Yes", "Yes")

                        @Html.RadioButtonFor(model => model.person1 , "No", new { id = "person1No" })
                        @Html.Label("No", "No")

                    </div>
                </div>


                    <div class="form-group">
                        @Html.LabelFor(model => model.Service, htmlAttributes: new { @class = "control-label col-md-4" })
                        <div class="col-md-4">
                            @Html.EditorFor(model => model.Service, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.Service, "", new { @class = "text-danger" })
                        </div>
                    </div>

所以当我点击创建按钮时会发生这种情况: -

1.如果person1有价值&#34;是&#34;选中,我在屏幕上收到警告,警告是疯狂的。 2.如果是,则不显示任何警告。

但是当我选择&#34; NO&#34;然后单击“保存”它在db.savechanges()失败,出现以下错误&#34;服务字段是必需的&#34;。 我不确定为什么它在客户端工作但在保存时失败。

我试图尽可能地为新手解释一下。我本可以使用错误的术语,道歉。

1 个答案:

答案 0 :(得分:0)

这是因为在浏览器级别(Javascript验证)触发的验证看到当选择No时,它会通过验证。但是,在服务器端,EF正在执行相同的验证。在保存之前检查并查看person1在服务器端的值:如果为空或是,那就是问题所在。

在这种情况下,我为我的视图创建了一个模型(你拥有的模型)和一个用于我的ORM(EF)的模型。在EF模型中,不要放置RequiredIf属性。在保存之前,将模型(用于视图)转换为模型(用于EF),并且一切都应该是好的。