AutoMapper和必填字段

时间:2012-11-26 17:36:33

标签: asp.net-mvc automapper

我正在尝试仅使用域模型中的某些字段创建新记录。我为此创建了一个ViewModel,并使用了AutoMapper。

由于我的域模型中包含必需的字段,我的代码在一分钟内失败了。我在必要的字段上添加了opt => opt.Ignore()但是,我仍然遇到问题。

当我从StaffPresent字段中删除[Required]时,记录将添加到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);
    }

1 个答案:

答案 0 :(得分:1)

AutoMapper的配置与验证属性没有任何关系,它只是指定了如何在彼此之间映射对象的规则。

在您的情况下,映射:

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

告诉AutoMapper不要复制StaffPresent属性。

如果您的数据库模型具有[必需]属性,则仍需要在其他位置设置该数据。

根据您的评论需要注意的一点是,向ViewModel添加验证是一个好主意,因为它会阻止您使用不正确的数据调用数据库方法,为您提供client side validation,并允许您强制执行不同的约束比你的模型可能需要的。

相关问题