3

私の問題: カスタム検証属性は、webapi post メソッド (EF を使用) を呼び出すときに 1 回ではなく 2 回呼び出されます。次の点で検証します。

  1. ブレークポイントが webapi アプリケーションの post メソッドに入る直前 (おそらく ModelState にデータが入力されます)

  2. ここでも、挿入が行われる直前に (db.Applications.Add(application))

    [Table("Applications")]
    public class Application 
    {
        /// <summary>
        /// ApplicationID (auto-increment)
        /// </summary>
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int ApplicationID { get; set; }
    
        /// <summary>
        /// Name of the application
        /// </summary>
        [Required]
        [MaxLength(255)]
        public string ApplicationName { get; set; }
    
        /// <summary>
        /// Application ref (for friendly lookups)
        /// </summary>
        [Required]
        [MaxLength(150)]
        [UniqueApplicationReference] // <<<<<<< My custom validation attribute
        public string ApplicationRef { get; set; }
    
        /// <summary>
        /// Application status
        /// </summary>
        [Required]
        public bool? ApplicationStatus { get; set; }
    
        public virtual ICollection<ApplicationFeature> ApplicationFeatures { get; set; }
    
    }
    

これが私のwebAPIエンドポイントです:

public HttpResponseMessage PostApplication(Application application)
{
    if (ModelState.IsValid)
    {
        db.Applications.Add(application);
        db.SaveChanges();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, application);
        response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = application.ApplicationID }));
        return response;
    }
    else
    {
         return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
}

アプリケーションオブジェクトにデータ転送クラスを提供し、データを渡す目的でほとんど/単純な検証を提供し、ドメイン固有の検証エラーが HttpResponseMessage を介してバブルバックするようにするだけのより良い解決策です。合理的なデータで試みましたか?

ありがとうございました!ダン。

4

0 に答える 0