1

ドメイン モデルの一部のフィールドのみを使用して新しいレコードを作成しようとしています。このためにViewModelを作成し、AutoMapperを使用しています。

ドメイン モデルにある必須フィールドが原因で、コードがすぐに失敗します。必要なフィールドに opt=>opt.Ignore() を追加しましたが、まだ問題があります。

[Required] を StaffPresent フィールドから削除すると、レコードが DB に追加されます。

私のGlobal.asax.csで

Mapper.CreateMap<CustomerSupportRecord, CustomerSupportRecordForCreation>();
Mapper.CreateMap<CustomerSupportRecordForCreation, CustomerSupportRecord>().ForMember(p=>p.StaffPresent, opt=>opt.Ignore());

ドメイン モデル

public class CustomerSupportRecord
{
    public int CustomerSupportRecordID { get; set; }

    [Required]
    public int CustomerID { get; set; }

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

    [Required(ErrorMessage = "Please enter a Date")]
    [DataType(DataType.Date)]
    [Display(Name = "Date")]
    public DateTime Date { get; set; }

    [Required(ErrorMessage = "Please select an Arrival Time")]
    [DataType(DataType.Time)]
    [Display(Name = "Arrival")]
    public DateTime ArrivalTime { get; set; }

    [DataType(DataType.Time)]
    [Display(Name = "Departure")]
    public DateTime? DepartureTime { get; set; }

    [Required(ErrorMessage = "Please select a Type")]
    [Display(Name = "Type")]
    public int CustomerSupportTypeID { get; set; }

    [Required(ErrorMessage = "Please enter the staff who were present at the Feedback")]
    [Display(Name = "Staff Present at Feedback")]
    public string StaffPresent { get; set; }

    [Display(Name = "Setting")]
    public string ReflectionSetting { get; set; }

    [Display(Name = "Advisor")]
    public string ReflectionAdvisor { get; set; }

    [Display(Name = "Notes")]
    public string Notes { get; set; }

    [Display(Name = "Comments")]
    public string Comments { get; set; }

    // Navigation Properties
    public virtual Customer Customer { get; set; }
    public virtual CustomerSupportType CustomerSupportType { get; set; }
    public virtual Employee Employee { get; set; }
}

ビューモデル

public class CustomerSupportRecordForCreation
{
    public int CustomerSupportRecordID { get; set; }

    public int CustomerID { get; set; }

    public string EmployeeID { get; set; }

    [DataType(DataType.Date)]
    [Display(Name = "Date")]
    public DateTime Date { get; set; }

    [DataType(DataType.Time)]
    [Display(Name = "Arrival")]
    public DateTime ArrivalTime { get; set; }

    [Display(Name = "Type")]
    public int CustomerSupportTypeID { get; set; }

    [Display(Name = "Notes")]
    public string Notes { get; set; }
}

そして最後に私のコントローラー

    //
    // GET: /CustomerSupport/CustomerSupportRecord/Create

    public ActionResult Create()
    {
        ViewBag.CustomerSupportTypeID = new SelectList(db.CustomerSupportType, "CustomerSupportTypeID", "CustomerSupportTypeName");
        var model = new CustomerSupportRecordForCreation { CustomerID = 1, EmployeeID = "20213" };

        return View("Create", model);

    }

    //
    // POST: /CustomerSupport/CustomerSupportRecord/Create

    [HttpPost]
    public ActionResult Create(CustomerSupportRecordForCreation customersupportrecord)
    {

        if (ModelState.IsValid)
        {
            var newRecord = Mapper.Map<CustomerSupportRecordForCreation, CustomerSupportRecord>(customersupportrecord);
            db.CustomerSupportRecord.Add(newRecord);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
            ViewBag.CustomerSupportTypeID = new SelectList(db.CustomerSupportType, "CustomerSupportTypeID", "CustomerSupportTypeName", customersupportrecord.CustomerSupportTypeID);
            return View(customersupportrecord);
    }
4

1 に答える 1

2

AutoMapperの構成は、検証属性とは何の関係もありません。オブジェクトを相互にマップする方法のルールを指定するだけです。

あなたの場合、マッピング:

Mapper.CreateMap<CustomerSupportRecordForCreation, CustomerSupportRecord>().ForMember(p=>p.StaffPresent, opt=>opt.Ignore());

AutoMapperにStaffPresentプロパティをコピーしないように指示します。

データベースモデルに[必須]属性がある場合でも、そのデータを別の場所に設定する必要があります。

コメントに基づいて注意すべき点が1つあります。これにより、ViewModelに検証を追加することをお勧めします。これにより、不適切なデータを使用してデータベースメソッドを呼び出すことができなくなり、クライアント側の検証が可能になり、モデルで必要となる可能性のあるものとは異なる制約を適用できるようになります。 。

于 2012-11-26T18:15:49.307 に答える