首先,感谢所有回答问题的人。我是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;。 我不确定为什么它在客户端工作但在保存时失败。
我试图尽可能地为新手解释一下。我本可以使用错误的术语,道歉。
答案 0 :(得分:0)
这是因为在浏览器级别(Javascript验证)触发的验证看到当选择No时,它会通过验证。但是,在服务器端,EF正在执行相同的验证。在保存之前检查并查看person1在服务器端的值:如果为空或是,那就是问题所在。
在这种情况下,我为我的视图创建了一个模型(你拥有的模型)和一个用于我的ORM(EF)的模型。在EF模型中,不要放置RequiredIf属性。在保存之前,将模型(用于视图)转换为模型(用于EF),并且一切都应该是好的。