验证依赖于其他实体属性值的传入请求?

时间:2014-07-20 14:51:36

标签: c# asp.net-mvc entity-framework validation unobtrusive-validation

我知道有data annotation来验证[Required][Range()]等数据。更不用说unobtrusive validation使客户端更容易了。非常感谢他们。

但是,如果您需要验证取决于实体属性值的值,那该怎么办?我有这种情况,说:

我的模特:

public class Schedule
{
  public int Id { get; set; }
  public DatetimeOffset StartDate { get; set; }
  public DatetimeOffset EndDate { get; set; }
}

现在位于form

<input type="text" name="StartDate" />
<input type="text" name="EndDate" />

您如何确认EndDate不应less than StartDateattribute中有内置的data annotation吗?或者应该定制一个?如果能够使用微软的unobstrusive validation那将会很棒。

这是另一种情况:

如果您要进行的验证取决于数据库中保存的值,该怎么办?说,

public class Bag
{
  //constructor
  public int Capacity { get; set; }

  public virtual ICollection<Item> Items { get; set; }
}

public class Item
{
  //constructor
  public string Description { get; set; }

  public virtual ICollection<Bag> Bags { get; set; }
}

如果您要对Items添加Bag进行验证,但是如果用户尝试输入超出Bag Capacity的限制,应该显示验证错误。

这可能吗?

我目前正在使用ASP.NET MVC 4. EF5 Code第一种方法。

1 个答案:

答案 0 :(得分:1)

第一种方法是实施IValidatableObject

public class Schedule : IValidatableObject
{
    public int Id { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (StartDate > EndDate)
        {
            yield return new ValidationResult("End date must be greater than start date.", new [] { "EndDate"});
        }
    }
}

它将在服务器端的模型绑定期间自动执行。

如果您想在客户端进行验证,您还可以选择。其中之一是远程验证。你可以阅读它here。总结一下:您必须创建constroller和action,它接受验证的值并返回它是否有效。它可能需要多个值。例如,如果要检查唯一性,请使用ID和用户名。

显然,在日期比较中不需要向服务器发送值。您可以实现自己的验证属性来处理客户端的比较。有人试图实现它here