แทรกข้อมูลโดยใช้คลาสโมเดลมุมมอง

Aug 20 2020

คลาสรุ่น ::

public class MappedModels
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int MappedId { get; set; }
        public int MappedType { get; set; }
        public decimal MappedAmount { get; set; }
        
        [ForeignKey("ProjectId")]
        public ProjectModels Project { get; set; } 
        public int ProjectId { get; set; }
    }

ดูรุ่นคลาส ::

public class MappedViewModels
    {
        public int MappedType { get; set; }
        public decimal MappedAmount { get; set; }
        public int ProjectId { get; set; }
        public string ProjectName { get; set; }
        
        // these two fields only in MappedViewModels for calculation purpose
        public decimal ProjectAllocatedAmount { get; set; } 
        public decimal RemainingAmount { get; set; }  
}

ฉันได้สร้างCreate.cshtmlเพจสำหรับMappedModelsใช้ MappedViewModels ตอนนี้เมื่อฉันพยายามส่งแบบฟอร์มฉันได้รับข้อผิดพลาด ::

The model item passed into the dictionary is of type 'myapp.Models.MappedModels', but this dictionary requires a model item of type 'myapp.ViewModels.MappedViewModels'.

วิธีการสร้างตัวควบคุมของฉัน ::

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MappedId,MappedType,MappedAmount,ProjectId")] MappedModels mappedModels)
{
    if (ModelState.IsValid)
    {
        db.Mappeds.Add(mappedModels);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

หากฉันเปลี่ยนวิธีการเป็นpublic ActionResult Create( MappedViewModels mappedModels)แล้วได้รับข้อผิดพลาดในdb.Mappeds.Add(mappedModels)

ฉันต้องใช้ฟิลด์ของMappedViewModelsในpublic ActionResult Create(int? ProjectId).

นอกจากนี้ของฉันMappedViewModelsไม่มีแอตทริบิวต์MappedIdหากฉันเก็บไว้ที่นั่น (MappedViewModels) MappedIdจะเพิ่มขึ้นอัตโนมัติได้อย่างไร

วิธีการแทรกข้อมูลโดยใช้MappedViewModelsto MappedModels?

ตามที่แนะนำในวิธีแก้ปัญหาฉันได้ลอง ::

public ActionResult Create([Bind(Include = "MappedType,MappedAmount,ProjectId")] MappedViewModels model)
{
    if (ModelState.IsValid)
    {
        var dbMappedModel = new MappedModels
        {
          MappedType = model.MappedType,
          MappedAmount = model.MappedAmount,
          ProjectId = model.ProjectId
        }

        db.Mappeds.Add(dbMappedModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.แต่ได้รับข้อผิดพลาด สาเหตุเกิดจากคลาส Project ที่มีฟิลด์ที่ต้องการหลายฟิลด์ กรุณาช่วย!!!

คำตอบ

1 SowmyadharGourishetty Aug 20 2020 at 10:37

อัปเดตตรรกะการดำเนินการของคุณดังต่อไปนี้

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MappedType,MappedAmount,ProjectId")] MappedViewModels model)
{
    if (ModelState.IsValid)
    {
        // when you add to the context, create a new MappedModels object
        // You need not to worry about the MappedId, it will be auto incremented
        var dbMappedModel = new MappedModels
        {
          MappedType = model.MappedType,
          MappedAmount = = model.MappedAmount,
        
          Project = new ProjectModels { ... }
        }

        db.Mappeds.Add(dbMappedModel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(mappedModels);
}

คือการใช้สิ่งที่[Bind(Include = "MappedType,MappedAmount,ProjectId")]ผมไม่คิดว่าเป็นสิ่งจำเป็น ฉันไม่เคยใช้มัน