вставить данные с помощью класса модели представления

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")]этого, думаю, не требуется. Я никогда этим не пользовался.