检查实体框架中的模型错误

时间:2013-07-25 18:47:34

标签: c# asp.net-mvc

在我的控制器中,我有一个接受3个参数(primary_key,property和value)的动作,并使用反射来设置相应模型的值。 (由其主键找到)

我认为我可以捕获模型,如果它是ModelState.IsValid,但它的评估结果为真。现在它转到db.SaveChanges();抛出异常。

ModelState有效。 (显然,它不是主键找到的模型实例,实际上是指我的三个输入)。

我以为我可以通过以下行查看我的模型错误...

if (System.Data.Entity.Validation.DbEntityValidationResult.ValidationErrors.Empty)

但是我收到了“遗失对象引用”错误。

我不知道这意味着什么。 (C#和其他所有内容都是新手。)有什么帮助吗?

编辑1 - 显示更多代码:

验证

[Column("pilot_disembarked")]
[IsDateAfter(testedPropertyName: "Undocked", 
             allowEqualDates: true, 
             ErrorMessage = "End date needs to be after start date")]
public Nullable<System.DateTime> PilotDisembarked { get; set; }

自定义有效性

public sealed class IsDateAfter : ValidationAttribute, IClientValidatable
{
    private readonly string testedPropertyName;
    private readonly bool allowEqualDates;

    public IsDateAfter(string testedPropertyName, bool allowEqualDates = false)
    {
        this.testedPropertyName = testedPropertyName;
        this.allowEqualDates = allowEqualDates;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var propertyTestedInfo = validationContext.ObjectType.GetProperty(this.testedPropertyName);
        if (propertyTestedInfo == null)
        {
            return new ValidationResult(string.Format("unknown property {0}", this.testedPropertyName));
        }

        var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance, null);

        if (value == null || !(value is DateTime))
        {
            return ValidationResult.Success;
        }

        if (propertyTestedValue == null || !(propertyTestedValue is DateTime))
        {
            return ValidationResult.Success;
        }

        // Compare values
        if ((DateTime)value >= (DateTime)propertyTestedValue)
        {
            if (this.allowEqualDates)
            {
                return ValidationResult.Success;
            }
            if ((DateTime)value > (DateTime)propertyTestedValue)
            {
                return ValidationResult.Success;
            }
        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }
 }

控制器操作

    [HttpPost]
    public ActionResult JsonEdit(string name, int pk, string value)
    {
        Voyage voyage = db.Voyages.Find(pk);

        var property = voyage.GetType().GetProperty(name);

        if (Regex.Match(property.PropertyType.ToString(), "DateTime").Success)
        {
            try
            {
              if (Regex.Match(value, @"^\d{4}$").Success)
              {
                var newValue = DateTime.ParseExact(value, "HHmm", System.Globalization.CultureInfo.InvariantCulture);
                property.SetValue(voyage, newValue, null);
              }
              else if (value.Length == 0)
              {
                  property.SetValue(voyage, null, null);
              }
              else
              {
                var newValue = DateTime.ParseExact(value, "yyyy/MM/dd HHmm", System.Globalization.CultureInfo.InvariantCulture);
                property.SetValue(voyage, newValue, null);
              }
            }
            catch
            {
                Response.StatusCode = 400;
                return Json("Incorrect Time Entry.");
            }
        }
        else
        {
            var newValue = Convert.ChangeType(value, property.PropertyType);
            property.SetValue(voyage, newValue, null);
        }

        if (ModelState.IsValid)
        {
            db.SaveChanges();
            Response.StatusCode = 200;
            return Json("Success!");
        }
        else
        {
            Response.StatusCode = 400;
            return Json(ModelState.Keys.SelectMany(key => this.ModelState[key].Errors));
        }

    }

1 个答案:

答案 0 :(得分:0)

当模型的任何值在此时为空时 ModelState.IsValid 。首先检查模型数据。