insérer des données à l'aide de la classe de modèle de vue

Aug 20 2020

Classe de modèle ::

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

Voir la classe de modèle ::

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

J'ai créé la Create.cshtmlpage pour MappedModelsutiliser MappedViewModels. Maintenant, lorsque j'essaye de soumettre le formulaire, j'obtiens une erreur:

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

Ma méthode de contrôleur 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);
}

Si je change la méthode en public ActionResult Create( MappedViewModels mappedModels), puis obtenir une erreur dansdb.Mappeds.Add(mappedModels)

Je dois utiliser les champs de MappedViewModelsin public ActionResult Create(int? ProjectId).

De plus, mon MappedViewModelsne contient pas d'attribut MappedId, si je le garde là (MappedViewModels), comment peut-il MappedIdêtre incrémenté automatiquement .

Alors, comment insérer des données en utilisant MappedViewModelsto MappedModels?

Comme suggéré dans la solution, j'ai essayé:

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

Mais obtenir une erreur Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.. Cela est dû à la classe Project où il y a plusieurs champs obligatoires. Veuillez aider !!!

Réponses

1 SowmyadharGourishetty Aug 20 2020 at 10:37

Mettez à jour votre logique d'action comme ci-dessous

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

À quoi sert [Bind(Include = "MappedType,MappedAmount,ProjectId")]je ne pense pas que ce soit nécessaire. Je ne l'ai jamais utilisé.