ビューモデルクラスを使用してデータを挿入する

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; }  
}

MappedViewModelsCreate.cshtmlMappedModels使用するためのページを作成しました。フォームを送信しようとすると、エラーが発生します::

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'.

私のCreateコントローラーメソッド::

[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自動インクリメントする方法もあります

では、toを使用MappedViewModelsしてデータを挿入する方法は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")]かそれは必要ないと思います。私はそれを使ったことがありません。